Bcellmagic analysis pipeline
Pipeline overview
Number of sequences
Number of reads for each of the samples and number of sequences left
after representative analysis steps.
| ID |
Source |
Treatment |
Extraction_time |
Population |
Sequences_R1 |
Sequences_R2 |
Filtered_quality_R1 |
Filtered_quality_R2 |
Mask_primers_R1 |
Mask_primers_R2 |
Paired |
Build_consensus |
Assemble_pairs |
Unique |
Representative_2 |
Igblast |
| QMKMK229AC |
CLAD1B |
Cladribin |
baseline |
DN |
1001901 |
1001901 |
998230 |
929323 |
950964 |
889152 |
874759 |
523735 |
90355 |
59292 |
8473 |
6791 |
| QMKMK230AF |
CLAD1B |
Cladribin |
baseline |
N |
601885 |
601885 |
599360 |
566181 |
571750 |
543140 |
533806 |
402066 |
97532 |
92699 |
6384 |
4471 |
| QMKMK231AN |
CLAD1B |
Cladribin |
baseline |
M |
1036290 |
1036290 |
1033363 |
964197 |
980082 |
919636 |
904197 |
780526 |
135769 |
124173 |
4958 |
4670 |
| QMKMK232AV |
CLAD1B |
Cladribin |
baseline |
P |
1352414 |
1352414 |
1346800 |
1262235 |
1290104 |
1212304 |
1196447 |
939219 |
149869 |
130718 |
7715 |
6761 |
| QMKMK233A5 |
CLAD1C |
Cladribin |
6months |
DN |
1223690 |
1223690 |
1218476 |
1135468 |
1160160 |
1085218 |
1067347 |
791259 |
164345 |
121161 |
12723 |
11199 |
| QMKMK234AD |
CLAD1C |
Cladribin |
6months |
N |
577697 |
577697 |
574852 |
539847 |
539088 |
508859 |
500228 |
385785 |
89640 |
88086 |
4824 |
3042 |
| QMKMK235AL |
CLAD1C |
Cladribin |
6months |
M |
801072 |
801072 |
799337 |
750714 |
761523 |
718534 |
706606 |
608541 |
111207 |
95243 |
4519 |
4087 |
| QMKMK236AT |
CLAD1C |
Cladribin |
6months |
P |
2043123 |
2043123 |
2033938 |
1877437 |
1930800 |
1784871 |
1761332 |
1235841 |
181411 |
160569 |
15490 |
13604 |
| QMKMK241AU |
CLAD1D |
Cladribin |
12months |
DN |
1857453 |
1857453 |
1847028 |
1701105 |
1709731 |
1569714 |
1550126 |
857643 |
153793 |
117453 |
14307 |
11728 |
| QMKMK242A4 |
CLAD1D |
Cladribin |
12months |
M |
1850771 |
1850771 |
1846857 |
1708178 |
1770918 |
1632432 |
1611884 |
1280996 |
217152 |
195283 |
10504 |
7908 |
| QMKMK243AC |
CLAD1D |
Cladribin |
12months |
N |
1244736 |
1244736 |
1242282 |
1135476 |
1178264 |
1075176 |
1059637 |
679954 |
139280 |
136735 |
15418 |
4904 |
| QMKMK244AK |
CLAD1D |
Cladribin |
12months |
P |
1811754 |
1811754 |
1807946 |
1664568 |
1739221 |
1597527 |
1577659 |
1079476 |
254312 |
209764 |
21119 |
17531 |
| QMKMK533AN |
CLAD2B |
Cladribin |
baseline |
N |
299299 |
299299 |
298776 |
284644 |
278650 |
263896 |
259773 |
136538 |
42888 |
21024 |
3065 |
2478 |
| QMKMK534AV |
CLAD2B |
Cladribin |
baseline |
M |
911354 |
911354 |
909208 |
856360 |
853308 |
802774 |
789542 |
619034 |
99507 |
87314 |
6089 |
5676 |
| QMKMK535A5 |
CLAD2B |
Cladribin |
baseline |
DN |
1548122 |
1548122 |
1546518 |
1485086 |
1455661 |
1392202 |
1373849 |
746018 |
162418 |
91819 |
14290 |
12021 |
| QMKMK536AD |
CLAD2B |
Cladribin |
baseline |
P |
828075 |
828075 |
826764 |
781959 |
769833 |
729669 |
715212 |
583392 |
116702 |
101158 |
7315 |
7063 |
| QMKMK537AL |
CLAD2C |
Cladribin |
6months |
N |
1695948 |
1695948 |
1695010 |
1636672 |
1564060 |
1506398 |
1482971 |
541493 |
162342 |
145709 |
25033 |
10018 |
| QMKMK538AT |
CLAD2C |
Cladribin |
6months |
M |
2467900 |
2467900 |
2466808 |
2356982 |
2309769 |
2200497 |
2169463 |
767598 |
187811 |
126228 |
19933 |
17408 |
| QMKMK539A3 |
CLAD2C |
Cladribin |
6months |
DN |
1670407 |
1670407 |
1669498 |
1608729 |
1548656 |
1486886 |
1464870 |
472354 |
119636 |
57321 |
9888 |
8395 |
| QMKMK540A6 |
CLAD2C |
Cladribin |
6months |
P |
1418658 |
1418658 |
1417830 |
1366294 |
1320682 |
1272534 |
1251506 |
771396 |
206753 |
144571 |
18111 |
16220 |
| QMKMK541AE |
CLAD2D |
Cladribin |
12months |
N |
1254799 |
1254799 |
1253722 |
1212466 |
1174117 |
1107772 |
1090535 |
522116 |
180332 |
174805 |
16652 |
7429 |
| QMKMK542AM |
CLAD2D |
Cladribin |
12months |
M |
2480119 |
2480119 |
2478403 |
2372338 |
2315848 |
2199929 |
2166193 |
1126337 |
265733 |
232683 |
15946 |
13289 |
| QMKMK543AU |
CLAD2D |
Cladribin |
12months |
DN |
1492340 |
1492340 |
1491521 |
1430650 |
1373414 |
1309222 |
1288903 |
743613 |
187691 |
140125 |
15719 |
12861 |
| QMKMK544A4 |
CLAD2D |
Cladribin |
12months |
P |
1104002 |
1104002 |
1103382 |
1063497 |
1036043 |
994570 |
979051 |
493551 |
147757 |
93526 |
13522 |
11413 |
| QMKMK545AC |
CLAD3B |
Cladribin |
baseline |
N |
1571620 |
1571620 |
1570771 |
1523584 |
1497824 |
1451341 |
1431781 |
543131 |
171670 |
143580 |
26461 |
14093 |
| QMKMK546AK |
CLAD3B |
Cladribin |
baseline |
M |
1798031 |
1798031 |
1796794 |
1739586 |
1712984 |
1656005 |
1636655 |
1007055 |
254909 |
229384 |
13572 |
12353 |
| QMKMK547AS |
CLAD3B |
Cladribin |
baseline |
DN |
1325826 |
1325826 |
1324051 |
1277183 |
1262297 |
1218805 |
1199399 |
629789 |
146170 |
105951 |
13941 |
11564 |
| QMKMK548A2 |
CLAD3B |
Cladribin |
baseline |
P |
1375460 |
1375460 |
1374152 |
1327752 |
1308934 |
1264258 |
1245115 |
730531 |
161037 |
141148 |
13243 |
12400 |
| QMKMK549AA |
CLAD3C |
Cladribin |
6months |
N |
1385899 |
1385899 |
1385012 |
1335147 |
1305595 |
1255991 |
1239376 |
490510 |
158561 |
140711 |
30700 |
13134 |
| QMKMK550AD |
CLAD3C |
Cladribin |
6months |
M |
1240876 |
1240876 |
1240142 |
1207393 |
1183864 |
1149887 |
1136654 |
681733 |
204625 |
143603 |
17405 |
15518 |
| QMKMK551AL |
CLAD3C |
Cladribin |
6months |
DN |
261349 |
261349 |
260058 |
244972 |
215326 |
231145 |
197023 |
176276 |
32322 |
19154 |
2452 |
1428 |
| QMKMK552AT |
CLAD3C |
Cladribin |
6months |
P |
235034 |
235034 |
234857 |
229626 |
224030 |
219497 |
216216 |
172572 |
77444 |
53394 |
7446 |
7258 |
| QMKMK553A3 |
CLAD3D |
Cladribin |
12months |
N |
1591756 |
1591756 |
1590676 |
1540766 |
1517741 |
1464383 |
1445065 |
515304 |
173695 |
149072 |
28652 |
15265 |
| QMKMK554AB |
CLAD3D |
Cladribin |
12months |
M |
1564019 |
1564019 |
1562831 |
1507023 |
1492048 |
1428178 |
1411785 |
779001 |
213213 |
166219 |
19734 |
15267 |
| QMKMK555AJ |
CLAD3D |
Cladribin |
12months |
DN |
111483 |
111483 |
111312 |
107140 |
103242 |
100959 |
97245 |
85541 |
42105 |
30219 |
5062 |
4850 |
| QMKMK556AR |
CLAD3D |
Cladribin |
12months |
P |
155013 |
155013 |
154892 |
151406 |
146876 |
144291 |
141167 |
87747 |
48027 |
25315 |
4504 |
4231 |
| QMKMK557A1 |
CLAD4C |
Cladribin |
6months |
N |
1398965 |
1398965 |
1392433 |
1294121 |
1330529 |
1238996 |
1220960 |
745805 |
129053 |
123154 |
9745 |
4513 |
| QMKMK558A9 |
CLAD4C |
Cladribin |
6months |
M |
1374928 |
1374928 |
1368571 |
1237182 |
1305056 |
1178785 |
1164891 |
979677 |
141172 |
122743 |
6397 |
5864 |
| QMKMK559AH |
CLAD4C |
Cladribin |
6months |
DN |
2409179 |
2409179 |
2398262 |
2172405 |
2301729 |
2083291 |
2058484 |
1124294 |
196875 |
154806 |
19607 |
16828 |
| QMKMK560AK |
CLAD4C |
Cladribin |
6months |
P |
1068173 |
1068173 |
1064298 |
978142 |
1021878 |
940132 |
928637 |
709471 |
170037 |
146347 |
9105 |
8546 |
| QMKMK561AS |
CLAD4B |
Cladribin |
baseline |
N |
1641107 |
1641107 |
1576042 |
1345005 |
1477248 |
1274519 |
1229456 |
874313 |
68882 |
67175 |
2443 |
132 |
| QMKMK562A2 |
CLAD4B |
Cladribin |
baseline |
M |
1385399 |
1385399 |
1379705 |
1250203 |
1320361 |
1196503 |
1179563 |
962388 |
157539 |
143239 |
7104 |
6066 |
| QMKMK563AA |
CLAD4B |
Cladribin |
baseline |
DN |
2589345 |
2589345 |
2576384 |
2318103 |
2466634 |
2218225 |
2186658 |
1244924 |
195807 |
163855 |
20592 |
16886 |
| QMKMK564AI |
CLAD4B |
Cladribin |
baseline |
P |
1801823 |
1801823 |
1794104 |
1626149 |
1707738 |
1549822 |
1527755 |
970295 |
139582 |
117106 |
10528 |
9215 |
| QMKMK565AQ |
CLAD4D |
Cladribin |
12months |
N |
1233912 |
1233912 |
1227233 |
1127439 |
1171418 |
1074382 |
1058954 |
706029 |
124862 |
119937 |
8170 |
4154 |
| QMKMK566A0 |
CLAD4D |
Cladribin |
12months |
M |
1519136 |
1519136 |
1511801 |
1377911 |
1458300 |
1325813 |
1307238 |
1038900 |
165094 |
139608 |
10051 |
9029 |
| QMKMK567A8 |
CLAD4D |
Cladribin |
12months |
DN |
1084835 |
1084835 |
1077309 |
963006 |
985191 |
874572 |
862952 |
641428 |
113520 |
106915 |
8246 |
4478 |
| QMKMK568AG |
CLAD4D |
Cladribin |
12months |
P |
1322433 |
1322433 |
1317876 |
1210528 |
1271272 |
1164834 |
1150760 |
665752 |
151153 |
105446 |
9344 |
7211 |
| QMKMK569AO |
CLAD5B |
Cladribin |
baseline |
N |
1447197 |
1447197 |
1445335 |
1373651 |
1337298 |
1269719 |
1252608 |
619525 |
174483 |
158367 |
18757 |
6711 |
| QMKMK570AR |
CLAD5B |
Cladribin |
baseline |
M |
1468661 |
1468661 |
1466765 |
1367672 |
1319151 |
1225178 |
1209652 |
893529 |
189690 |
167979 |
7970 |
6680 |
| QMKMK571A1 |
CLAD5B |
Cladribin |
baseline |
DN |
1126741 |
1126741 |
1125031 |
1062795 |
1031127 |
971370 |
960077 |
512020 |
112117 |
70506 |
9255 |
6407 |
| QMKMK572A9 |
CLAD5B |
Cladribin |
baseline |
P |
1397460 |
1397460 |
1396014 |
1316108 |
1290285 |
1214297 |
1199625 |
843531 |
178334 |
134204 |
12207 |
10850 |
| QMKMK573AH |
CLAD5C |
Cladribin |
6months |
N |
1329042 |
1329042 |
1326871 |
1258667 |
1193608 |
1129648 |
1114054 |
535460 |
159472 |
147245 |
17033 |
5721 |
| QMKMK574AP |
CLAD5C |
Cladribin |
6months |
M |
1237833 |
1237833 |
1236499 |
1162554 |
1137697 |
1066878 |
1053987 |
813652 |
164645 |
137354 |
6905 |
6396 |
| QMKMK575AX |
CLAD5C |
Cladribin |
6months |
DN |
1383178 |
1383178 |
1381643 |
1296415 |
1266158 |
1181512 |
1167639 |
852504 |
190751 |
173985 |
7869 |
5721 |
| QMKMK576A7 |
CLAD5C |
Cladribin |
6months |
P |
1262705 |
1262705 |
1261244 |
1179067 |
1143706 |
1064972 |
1051693 |
793721 |
206575 |
171237 |
10787 |
9634 |
| QMKMK577AF |
CLAD5D |
Cladribin |
12months |
N |
1351967 |
1351967 |
1350771 |
1280959 |
1243575 |
1172545 |
1156655 |
527186 |
156410 |
144944 |
15828 |
5310 |
| QMKMK578AN |
CLAD5D |
Cladribin |
12months |
M |
713600 |
713600 |
712818 |
676328 |
667632 |
628686 |
622159 |
517446 |
126348 |
101977 |
4161 |
3828 |
| QMKMK579AV |
CLAD5D |
Cladribin |
12months |
DN |
2456014 |
2456014 |
2451084 |
2269903 |
2141182 |
1958202 |
1938322 |
660014 |
132908 |
86960 |
14236 |
11742 |
| QMKMK580A0 |
CLAD5D |
Cladribin |
12months |
P |
834969 |
834969 |
834181 |
787283 |
779041 |
731399 |
722664 |
580601 |
147105 |
115414 |
6573 |
6144 |
| QMKMK581A8 |
CLAD6B |
Cladribin |
baseline |
N |
1001206 |
1001206 |
1000860 |
970356 |
962940 |
936587 |
920818 |
443222 |
140229 |
86143 |
18836 |
12878 |
| QMKMK582AG |
CLAD6B |
Cladribin |
baseline |
M |
1283684 |
1283684 |
1283183 |
1244329 |
1236314 |
1203407 |
1184237 |
788066 |
169359 |
149750 |
15319 |
14341 |
| QMKMK583AO |
CLAD6B |
Cladribin |
baseline |
DN |
1097528 |
1097528 |
1096978 |
1066751 |
1063618 |
1033309 |
1021656 |
634968 |
162236 |
105873 |
17898 |
16467 |
| QMKMK584AW |
CLAD6B |
Cladribin |
baseline |
P |
1016627 |
1016627 |
1016172 |
988801 |
984990 |
962146 |
947239 |
442684 |
163958 |
76798 |
20099 |
18856 |
| QMKMK585A6 |
CLAD6C |
Cladribin |
6months |
N |
1285504 |
1285504 |
1285176 |
1251705 |
1229806 |
1201931 |
1182778 |
543798 |
171993 |
148550 |
28207 |
18305 |
| QMKMK586AE |
CLAD6C |
Cladribin |
6months |
M |
1330009 |
1330009 |
1329416 |
1292399 |
1284875 |
1253526 |
1233148 |
891219 |
225138 |
195468 |
18430 |
16976 |
| QMKMK587AM |
CLAD6C |
Cladribin |
6months |
DN |
1242825 |
1242825 |
1240467 |
1197808 |
1200344 |
1156147 |
1137148 |
654652 |
192553 |
126264 |
26230 |
24527 |
| QMKMK588AU |
CLAD6C |
Cladribin |
6months |
P |
1002045 |
1002045 |
1001430 |
967754 |
965269 |
932794 |
921632 |
434166 |
147296 |
84074 |
18889 |
16981 |
| QMKMK589A4 |
CLAD6D |
Cladribin |
12months |
N |
1137999 |
1137999 |
1137344 |
1103323 |
1097509 |
1066778 |
1049119 |
462124 |
140909 |
135523 |
21101 |
13153 |
| QMKMK590A7 |
CLAD6D |
Cladribin |
12months |
M |
1209002 |
1209002 |
1208461 |
1171649 |
1172398 |
1134117 |
1117971 |
734223 |
260961 |
216294 |
24198 |
22100 |
| QMKMK591AF |
CLAD6D |
Cladribin |
12months |
DN |
1197736 |
1197736 |
1197184 |
1151818 |
1136481 |
1087259 |
1076116 |
597055 |
230367 |
158143 |
28593 |
25805 |
| QMKMK592AN |
CLAD6D |
Cladribin |
12months |
P |
992655 |
992655 |
992309 |
965445 |
964234 |
935022 |
924219 |
613741 |
189846 |
142596 |
19689 |
18072 |
| QMKMK593AV |
CLAD7B |
Cladribin |
baseline |
N |
1072973 |
1072973 |
1072013 |
1039366 |
988048 |
953478 |
940620 |
440559 |
133366 |
110801 |
16443 |
7777 |
| QMKMK594A5 |
CLAD7B |
Cladribin |
baseline |
M |
1840517 |
1840517 |
1838589 |
1774842 |
1701120 |
1635963 |
1614648 |
951548 |
227994 |
188708 |
14404 |
12974 |
| QMKMK595AD |
CLAD7B |
Cladribin |
baseline |
DN |
1440796 |
1440796 |
1438064 |
1373169 |
1336916 |
1271791 |
1252865 |
628762 |
132142 |
78579 |
11111 |
9215 |
| QMKMK596AL |
CLAD7B |
Cladribin |
baseline |
P |
1677725 |
1677725 |
1676137 |
1618758 |
1542366 |
1484679 |
1464832 |
759840 |
228680 |
135179 |
19621 |
17044 |
| QMKMK597AT |
CLAD7C |
Cladribin |
6months |
N |
1239270 |
1239270 |
1237713 |
1198319 |
1123326 |
1081563 |
1066953 |
497750 |
144787 |
123197 |
13744 |
7293 |
| QMKMK598A3 |
CLAD7C |
Cladribin |
6months |
M |
1298404 |
1298404 |
1297197 |
1252956 |
1196708 |
1145838 |
1133594 |
718356 |
193453 |
162679 |
15845 |
12137 |
| QMKMK599AB |
CLAD7C |
Cladribin |
6months |
DN |
1254978 |
1254978 |
1253336 |
1203733 |
1142735 |
1087229 |
1075266 |
641336 |
171226 |
151010 |
14466 |
9894 |
| QMKMK600AI |
CLAD7C |
Cladribin |
6months |
P |
1479917 |
1479917 |
1470919 |
1412765 |
1358861 |
1304396 |
1281664 |
714214 |
66258 |
62212 |
3085 |
1416 |
| QMKMK601AQ |
CLAD7D |
Cladribin |
12months |
N |
1149545 |
1149545 |
1148532 |
1113085 |
1063607 |
1023791 |
1009898 |
423785 |
141212 |
121700 |
15720 |
8170 |
| QMKMK602A0 |
CLAD7D |
Cladribin |
12months |
M |
1939178 |
1939178 |
1936601 |
1866139 |
1800331 |
1717691 |
1698002 |
1106596 |
245524 |
189692 |
17130 |
15296 |
| QMKMK603A8 |
CLAD7D |
Cladribin |
12months |
DN |
1545739 |
1545739 |
1541982 |
1470482 |
1406198 |
1325331 |
1310600 |
517286 |
81954 |
48825 |
7513 |
6120 |
| QMKMK604AG |
CLAD7D |
Cladribin |
12months |
P |
1211943 |
1211943 |
1210523 |
1172308 |
1132847 |
1087549 |
1075259 |
486519 |
138916 |
90523 |
13014 |
10489 |
| QMKMK605AO |
CLAD8B |
Cladribin |
baseline |
N |
1444889 |
1444889 |
1444445 |
1385795 |
1385248 |
1321867 |
1304667 |
533331 |
155798 |
139077 |
20015 |
6758 |
| QMKMK606AW |
CLAD8B |
Cladribin |
baseline |
M |
1703561 |
1703561 |
1701051 |
1643939 |
1631017 |
1568457 |
1549559 |
1091551 |
151426 |
140107 |
8872 |
5779 |
| QMKMK607A6 |
CLAD8B |
Cladribin |
baseline |
DN |
1108324 |
1108324 |
1107613 |
1067244 |
1061080 |
1015816 |
1004178 |
528411 |
115796 |
81992 |
8232 |
6778 |
| QMKMK608AE |
CLAD8B |
Cladribin |
baseline |
P |
1540452 |
1540452 |
1539639 |
1477308 |
1482318 |
1412976 |
1397948 |
991925 |
207542 |
162117 |
13883 |
12397 |
| QMKMK609AM |
CLAD8C |
Cladribin |
6months |
N |
834333 |
834333 |
834049 |
798958 |
780110 |
742394 |
733064 |
418238 |
125716 |
105779 |
11087 |
5614 |
| QMKMK610AP |
CLAD8C |
Cladribin |
6months |
M |
1106235 |
1106235 |
1104644 |
1054961 |
1057632 |
1004099 |
991576 |
776744 |
157852 |
130084 |
6879 |
6471 |
| QMKMK611AX |
CLAD8C |
Cladribin |
6months |
DN |
1303870 |
1303870 |
1303135 |
1240914 |
1243559 |
1172185 |
1160462 |
730474 |
200257 |
157492 |
15955 |
11884 |
| QMKMK612A7 |
CLAD8C |
Cladribin |
6months |
P |
968338 |
968338 |
967925 |
925579 |
923220 |
878144 |
867982 |
661726 |
189758 |
152494 |
10350 |
8882 |
| QMKMK613AF |
CLAD8D |
Cladribin |
12months |
N |
1798683 |
1798683 |
1798081 |
1723011 |
1727265 |
1641478 |
1620069 |
633212 |
173678 |
154777 |
21448 |
8049 |
| QMKMK614AN |
CLAD8D |
Cladribin |
12months |
M |
1186393 |
1186393 |
1185783 |
1139636 |
1142249 |
1085053 |
1073036 |
752119 |
179325 |
153197 |
8280 |
7679 |
| QMKMK615AV |
CLAD8D |
Cladribin |
12months |
DN |
1407945 |
1407945 |
1407291 |
1342821 |
1314510 |
1238663 |
1225435 |
715692 |
188866 |
157712 |
12273 |
9193 |
| QMKMK616A5 |
CLAD8D |
Cladribin |
12months |
P |
1029639 |
1029639 |
1029226 |
988857 |
995363 |
947316 |
936477 |
661648 |
182340 |
158080 |
7835 |
7172 |
Plotting number of unique sequences

Plotting number of representative 2 sequences

Plotting number of Igblast identified sequences

Clonal abundance
For plotting the clonal abundance, the clones were ordered by size
from bigger clones to smaller clones (x-axis, Rank). The Abundance of
each clone was represented as the percentage of unique sequences in the
clone, with respect to the total number of unique sequences in that
subject (By Patient) or in the B-cell or T-cell sample (By Cell
Population).
To correct for the different number of sequences in each of the
samples, the Bootstrapping technique was employed, in which 200 random
bootstrap samples were taken, with size the number of sequences in the
sample with less sequences (N). The solid line shows the mean Abundance
of the bootstrap samples, whereas the transparent area shows the full
Abundance range of the bootstrap samples.
All clonal abundance plots and tables with abundance values can be
found under repertoire_analysis/Abundance.
Clonal abundance per subject

Count clones per subject
Clonal abundance per cell population
If different types of B-cell or T-cell populations are provided, here
the clonal abundance is plotted for each patient and B / T-cell
population.

Count clones per population
Clonal diversification index




Count clones per population
Clonal diversity
The clonal diversity \(D\) of the
repertoire was calculated according to the general formula of Hill
Diversity numbers:
\[
\begin{aligned}
^{q}D = \left( \sum_{i=1}^Rp_i^q \right)^{1/(1-q)}
\end{aligned}
\]
where:
- \(p_i\) is the proportion of unique
sequences belonging to clone \(i\).
- \(q\) are the values of the
different diversity numbers.
- \(R\) is the Richness, the number
of different clones in the sample.
At \(q=1\) the function is undefined
and the limit to zero equals the exponential of the Shannon Entropy:
\[
\begin{aligned}
^{1}D = exp \left( \sum_{i=1}^Rp_i ln(p_i) \right)
\end{aligned}
\]
The intuition about the different Hill Diversity values is the
following:
- At \(q=0\) the diversity index
equals the number of clones in the sample.
- At \(q=1\) the diversity index is
the geometric mean of the clones in the sample, weighted by their
proportion in the sample.
- At \(q>1\) more weight is given
to the clones with higher proportions in the sample.
All clonal diversity plots and tables with diversity values can be
found under repertoire_analysis/Diversity. To correct for
the different number of sequences in each of the samples, the
Bootstrapping technique was employed, in which 200 random bootstrap
samples were taken, with size the number of sequences in the sample with
less sequences (N). The solid line shows the mean Diversity of the
bootstrap samples, whereas the transparent area shows the full Diversity
range of the bootstrap samples.
Clonal diversity per subject
Clonal diversity at specific
q values
q=1
q=0
Clonal diversity per cell population
Clonal diversity per
population at specific q values
V gene usage
V gene family usage
The V gene usage (in percentage) in each of the samples is
represented below. All plots and tables can be found here.
Gene family usage is normalized by the number of clones.
By patient
By Population

There were 27 warnings (use warnings() to see them)

V gene usage
The V gene usage (in percentage) in each of the samples is
represented below. All plots and tables can be found here.
By clones
By sequences
Isotype usage
Isotype usage per subject
Isotype usage per cell population
`summarise()` has grouped output by 'isotype', 'sample_pop', 'source', 'treatment', 'extract_time'. You can override using the `.groups` argument.


Citations
If you use nf-core/bcellmagic for your analysis, please cite it using
the following DOI: 10.5281/zenodo.3607408
Please also cite the nf-core publication (P. A. Ewels et al. 2020).
In addition, citations for the tools and data used in this pipeline
are as follows:
- pRESTO (Vander Heiden et al.
2014)
- SHazaM, Change-O (Gupta et
al. 2015)
- Alakazam (Stern et al.
2014)
- TIgGER (Gadala-Maria et al.
2015)
- FastQC (Andrews et al.
2010)
- MultiQC (P. Ewels et al.
2016)
Andrews, Simon et al. 2010. “FastQC: A Quality Control Tool for
High Throughput Sequence Data.”
Ewels, Philip A., Alexander Peltzer, Sven Fillinger, Harshil Patel,
Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso,
and Sven Nahnsen. 2020.
“The Nf-Core Framework for
Community-Curated Bioinformatics Pipelines.” Nature
Biotechnology 38 (3): 276–78.
https://doi.org/10.1038/s41587-020-0439-x.
Ewels, Philip, Måns Magnusson, Sverker Lundin, and Max Käller. 2016.
“MultiQC: Summarize Analysis Results for Multiple Tools and
Samples in a Single Report.” Bioinformatics 32 (19):
3047–48.
Gadala-Maria, Daniel, Gur Yaari, Mohamed Uduman, and Steven H.
Kleinstein. 2015.
“Automated Analysis of High-Throughput b-Cell
Sequencing Data Reveals a High Frequency of Novel Immunoglobulin v Gene
Segment Alleles.” Proceedings of the National Academy of
Sciences of the United States of America 112 (8): E862–870.
https://doi.org/10.1073/pnas.1417683112.
Gupta, Namita T., Jason A. Vander Heiden, Mohamed Uduman, Daniel
Gadala-Maria, Gur Yaari, and Steven H. Kleinstein. 2015.
“Change-o: A Toolkit for Analyzing Large-Scale b Cell
Immunoglobulin Repertoire Sequencing Data.”
Bioinformatics 31 (20): 3356–58.
https://doi.org/10.1093/bioinformatics/btv359.
Stern, Joel N. H., Gur Yaari, Jason A. Vander Heiden, George Church,
William F. Donahue, Rogier Q. Hintzen, Anita J. Huttner, et al. 2014.
“B Cells Populating the Multiple Sclerosis Brain Mature in the
Draining Cervical Lymph Nodes.” Science Translational
Medicine 6 (248).
https://doi.org/10.1126/scitranslmed.3008879.
Vander Heiden, Jason A., Gur Yaari, Mohamed Uduman, Joel N. H. Stern,
Kevin C. O’Connor, David A. Hafler, Francois Vigneault, and Steven H.
Kleinstein. 2014.
“pRESTO: A Toolkit for Processing
High-Throughput Sequencing Raw Reads of Lymphocyte Receptor
Repertoires.” Bioinformatics 30 (13): 1930–32.
https://doi.org/10.1093/bioinformatics/btu138.
LS0tCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGFibGUgb2YgY29udGVudHMKICAgIHRvY19mbG9hdDogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICAjIGZsb2F0IHRoZSB0YWJsZSBvZiBjb250ZW50cyB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiBkb2N1bWVudCBjb250ZW50CiAgICB0b2NfZGVwdGg6IDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoZWFkZXIgbGV2ZWxzIDEsMiwzCiAgICB0aGVtZTogZGVmYXVsdAogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZSAgICAgICAgICAgICAgICAgICMgYWRkIHNlY3Rpb24gbnVtYmVyaW5nIHRvIGhlYWRlcnMKICAgIGRmX3ByaW50OiBwYWdlZCAgICAgICAgICAgICAgICAgICAgICAgICAjIHRhYmxlcyBhcmUgcHJpbnRlZCBhcyBhbiBodG1sIHRhYmxlIHdpdGggc3VwcG9ydCBmb3IgcGFnaW5hdGlvbiBvdmVyIHJvd3MgYW5kIGNvbHVtbnMKICAgIGNzczogLi9uZi1jb3JlX3N0eWxlLmNzcwogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgcGRmX2RvY3VtZW50OiB0cnVlCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCmJpYmxpb2dyYXBoeTogLi9yZWZlcmVuY2VzLmJpYnRleAotLS0KCgotLS0KdGl0bGU6ICJSZXBlcnRvaXJlIGFuYWx5c2lzIgpzdWJ0aXRsZTogIkNsb25hbCBhYnVuZGFuY2UsIGRpdmVyc2l0eSBhbmQgVi1mYW1pbHkgZ2VuZSB1c2FnZSIKZGF0ZTogJ2ByIGZvcm1hdChTeXMuRGF0ZSgpLCAiJUIgJWQsICVZIilgJwpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQKLS0tCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShkcGx5cikKbGlicmFyeShhbGFrYXphbSkKbGlicmFyeShzaGF6YW0pCmxpYnJhcnkoc3RyaW5ncikKCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShpZ3JhcGgpCmxpYnJhcnkoZ3Bsb3RzKQpsaWJyYXJ5KGNpcmNsaXplKQpsaWJyYXJ5KFVwU2V0UikKbGlicmFyeShndG9vbHMpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KGNvd3Bsb3QpCgp0aGVtZV9zZXQodGhlbWVfYncoYmFzZV9mYW1pbHkgPSAiQXJpYWxNVCIpICsKICAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHk9IkFyaWFsTVQiKSkpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmBgYAoqKioKCiMgQmNlbGxtYWdpYyBhbmFseXNpcyBwaXBlbGluZQoKIyMgUGlwZWxpbmUgb3ZlcnZpZXcKCiMjIE51bWJlciBvZiBzZXF1ZW5jZXMKCk51bWJlciBvZiByZWFkcyBmb3IgZWFjaCBvZiB0aGUgc2FtcGxlcyBhbmQgbnVtYmVyIG9mIHNlcXVlbmNlcyBsZWZ0IGFmdGVyIHJlcHJlc2VudGF0aXZlIGFuYWx5c2lzIHN0ZXBzLgoKYGBge3Igc2VxX251bWJlcnMsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQojVE9ETyByZWFkIFRhYmxlIHNlcXVlbmNlcwp0YWJfc2VxcyA8LSByZWFkLnRhYmxlKCIuLi8uLi9waXBlbGluZV9yZXN1bHRzX3Blcl90aW1lcG9pbnQvcGFyc2VkX2xvZ3Mvc2VxdWVuY2VzX3RhYmxlL1RhYmxlX3NlcXVlbmNlc19wcm9jZXNzLnRzdiIsIGhlYWRlcj1UUlVFLCBzZXA9Ilx0IiwgY2hlY2submFtZXMgPSBGQUxTRSkKa2FibGUodGFiX3NlcXMpICU+JQogICAga2FibGVfc3R5bGluZygiaG92ZXIiKSAlPiUKICAgIHNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICI0MDBweCIpCmBgYAoKUGxvdHRpbmcgbnVtYmVyIG9mIHVuaXF1ZSBzZXF1ZW5jZXMKCmBgYHtyIHNlcV9udW1iZXJzX3Bsb3RfdW5pcXVlLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLCBlY2hvPUZBTFNFfQp0YWJfc2VxcyRFeHRyYWN0aW9uX3RpbWUgPC0gZmFjdG9yKHRhYl9zZXFzJEV4dHJhY3Rpb25fdGltZSwgbGV2ZWxzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIikpCmc0IDwtIGdncGxvdCh0YWJfc2VxcywgYWVzKGZpbGw9RXh0cmFjdGlvbl90aW1lLCB5PVVuaXF1ZSwgeD1Qb3B1bGF0aW9uKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlNlcXVlbmNlIG51bWJlciIpICsKICBnZ3RpdGxlKCJVbmlxdWUgc2VxdWVuY2UgbnVtYmVycyBwZXIgc2FtcGxlIikgKwogIGZhY2V0X2dyaWQoY29scz12YXJzKFNvdXJjZSksIHNjYWxlcyA9ICJmcmVlIiwgZHJvcCA9IFQpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpnNApgYGAKCgpQbG90dGluZyBudW1iZXIgb2YgcmVwcmVzZW50YXRpdmUgMiBzZXF1ZW5jZXMKCmBgYHtyIHNlcV9udW1iZXJzX3Bsb3RfcmVwMiwgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuMywgZWNobz1GQUxTRX0KZzQgPC0gZ2dwbG90KHRhYl9zZXFzLCBhZXMoZmlsbD1FeHRyYWN0aW9uX3RpbWUsIHk9UmVwcmVzZW50YXRpdmVfMiwgeD1Qb3B1bGF0aW9uKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlNlcXVlbmNlIG51bWJlciIpICsKICBnZ3RpdGxlKCJSZXByZXNlbnRhdGl2ZTIgc2VxdWVuY2UgbnVtYmVycyBwZXIgc2FtcGxlIikgKwogIGZhY2V0X2dyaWQoY29scz12YXJzKFNvdXJjZSksIHNjYWxlcyA9ICJmcmVlIiwgZHJvcCA9IFQpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpnNApgYGAKCgpQbG90dGluZyBudW1iZXIgb2YgSWdibGFzdCBpZGVudGlmaWVkIHNlcXVlbmNlcwoKCmBgYHtyIHNlcV9udW1iZXJzX3Bsb3QsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0wLjMsIGVjaG89RkFMU0V9Cmc0IDwtIGdncGxvdCh0YWJfc2VxcywgYWVzKGZpbGw9RXh0cmFjdGlvbl90aW1lLCB5PUlnYmxhc3QsIHg9UG9wdWxhdGlvbikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKwogIHhsYWIoIiIpICsKICB5bGFiKCJTZXF1ZW5jZSBudW1iZXIiKSArCiAgZ2d0aXRsZSgiSWdibGFzdCBpZGVudGlmaWVkIHNlcXVlbmNlIG51bWJlciBwZXIgc2FtcGxlIikgKwogIGZhY2V0X2dyaWQoY29scz12YXJzKFNvdXJjZSksIHNjYWxlcyA9ICJmcmVlIiwgZHJvcCA9IFQpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpnNApgYGAKCgoKYGBge3IgcmVhZF9kYXRhLCBpbmNsdWRlPUZBTFNFfQojIFJlYWRpbmcgZGF0YSB0YWJsZXMgYW5kIGNlYXRpbmcgb3V0cHV0IGZvbGRlcnMKI2RhdGFkaXIgPC0gIi4iCm91dGRpciA8LSAicmVwZXJ0b2lyZV9jb21wYXJpc29uX3RwIgojIHNldHdkIHRvIHJlc3VsdHMgZm9sZGVyIChjb250YWluaW5nIGFsYWthemFtLCBzaGF6YW0sIGV0Yy4gZm9sZGVycykKIyMjIFJlYWQgYWxsIHRoZSB0YWJsZXMgYXMgcHJvZHVjZWQgYnkgdGhlIHBpcGVsaW5lIGluIHRoZSBjdXJyZW50IGZvbGRlciBhbmQgam9pbnMgdGhlbSB0b2dldGhlciBpbiB0aGUgZGZfYWxsIGRhdGFmcmFtZQojYWxsX2ZpbGVzIDwtIHN5c3RlbShwYXN0ZTAoImZpbmQgJyIsZGF0YWRpciwiJyAtbmFtZSAnKmdlcm0tcGFzcy50c3YnIiksIGludGVybj1UKQpkaXIuY3JlYXRlKG91dGRpcikKZGl2ZXJzaXR5X2RpciA8LSBwYXN0ZShvdXRkaXIsICJEaXZlcnNpdHkiLCBzZXA9Ii8iKQphYnVuZGFuY2VfZGlyIDwtIHBhc3RlKG91dGRpciwgIkFidW5kYW5jZSIsIHNlcD0iLyIpCnZmYW1pbHlfZGlyIDwtIHBhc3RlKG91dGRpciwgIlZfZmFtaWx5Iiwgc2VwPSIvIikKaXNvdHlwZV9kaXIgPC0gcGFzdGUob3V0ZGlyLCAiSXNvdHlwZSIsIHNlcD0iLyIpCmRpci5jcmVhdGUoZGl2ZXJzaXR5X2RpcikKZGlyLmNyZWF0ZShhYnVuZGFuY2VfZGlyKQpkaXIuY3JlYXRlKHZmYW1pbHlfZGlyKQpkaXIuY3JlYXRlKGlzb3R5cGVfZGlyKQojIEdlbmVyYXRlIG9uZSBiaWcgZGF0YWZyYW1lIGZyb20gYWxsIHBhdGllbnQgZGF0YWZyYW1lcwojZGZfYWxsID0gZGF0YS5mcmFtZSgpCiNmb3IgKGZpbGUgaW4gYWxsX2ZpbGVzKXsKIyAgICBmbmFtZSA9IGZpbGUKIyAgICBwcmludChmbmFtZSkKIyAgICBkZl9wYXQgPC0gcmVhZC5jc3YoZm5hbWUsIHNlcD0iXHQiKQojICAgIGRmX2FsbCA8LSByYmluZChkZl9hbGwsIGRmX3BhdCkKI30KI3dyaXRlLnRhYmxlKGRmX2FsbCwgcGFzdGUwKG91dGRpciwiL2FsbF9kYXRhLnRzdiIpLCBzZXAgPSAiXHQiLCBxdW90ZT1GLCByb3cubmFtZXMgPSBGLCBjb2wubmFtZXMgPSBUKQpkZl9hbGwgPC0gcmVhZC5jc3YoIi4uLy4uL3BpcGVsaW5lX3Jlc3VsdHNfcGVyX3RpbWVwb2ludC9yZXBlcnRvaXJlX2FuYWx5c2lzL3JlcGVydG9pcmVfY29tcGFyaXNvbi9hbGxfZGF0YS50c3YiLCBzZXA9Ilx0IikKCiMgUmVtb3ZlIHVuZGVyc2NvcmVzIGluIHRoZXNlIGNvbHVtbnMKZGZfYWxsJHRyZWF0bWVudCA8LSBzYXBwbHkoZGZfYWxsJHRyZWF0bWVudCwgZnVuY3Rpb24oeCkgc3RyX3JlcGxhY2UoYXMuY2hhcmFjdGVyKHgpLCAiXyIsICIiKSkKZGZfYWxsJHNvdXJjZSA8LSBzYXBwbHkoZGZfYWxsJHNvdXJjZSwgZnVuY3Rpb24oeCkgc3RyX3JlcGxhY2UoYXMuY2hhcmFjdGVyKHgpLCAiXyIsICIiKSkKZGZfYWxsJGV4dHJhY3RfdGltZSA8LSBzYXBwbHkoZGZfYWxsJGV4dHJhY3RfdGltZSwgZnVuY3Rpb24oeCkgc3RyX3JlcGxhY2UoYXMuY2hhcmFjdGVyKHgpLCAiXyIsICIiKSkKZGZfYWxsJHBvcHVsYXRpb24gPC0gc2FwcGx5KGRmX2FsbCRwb3B1bGF0aW9uLCBmdW5jdGlvbih4KSBzdHJfcmVwbGFjZShhcy5jaGFyYWN0ZXIoeCksICJfIiwgIiIpKQoKZGZfYWxsJHNvdXJjZSA8LSBzYXBwbHkoZGZfYWxsJHNvdXJjZSwgZnVuY3Rpb24oeCkgc3Vic3RyaW5nKGFzLmNoYXJhY3Rlcih4KSwxLDUpKQoKIyBBbm5vdGF0ZSBzYW1wbGUgYW5kIHNhbXBsZXBvcCAoc2FtcGxlICsgcG9wdWxhdGlvbikgYnkgYWRkIGluZyBhbGwgdGhlIGNvbmRpdGlvbnMKZGZfYWxsJHNhbXBsZSA8LSBhcy5mYWN0b3IocGFzdGUoZGZfYWxsJHRyZWF0bWVudCwgZGZfYWxsJGV4dHJhY3RfdGltZSwgZGZfYWxsJHNvdXJjZSwgc2VwPSJfIikpCmRmX2FsbCRzYW1wbGVfcG9wIDwtIGFzLmZhY3RvcihwYXN0ZShkZl9hbGwkdHJlYXRtZW50LCBkZl9hbGwkZXh0cmFjdF90aW1lLCBkZl9hbGwkc291cmNlLCBkZl9hbGwkcG9wdWxhdGlvbiwgc2VwPSJfIikpCiMgU2V0IG51bWJlciBvZiBib290cnN0cmFwcwpuYm9vdCA9IDIwMAoKIyBSZW1vdmluZyBDbGFkcmliaW5fNm1vbnRoc19DTEFENF9OIGJlY2F1c2Ugb2YgdG9vIGxpdHRsZSBzZXF1ZW5jZXMKZGZfYWxsIDwtIGRmX2FsbFshKGRmX2FsbCRzYW1wbGVfcG9wPT0iQ2xhZHJpYmluX2Jhc2VsaW5lX0NMQUQ0X04iKSxdCgpgYGAKCiMgQ2xvbmFsIGFidW5kYW5jZQoKRm9yIHBsb3R0aW5nIHRoZSBjbG9uYWwgYWJ1bmRhbmNlLCB0aGUgY2xvbmVzIHdlcmUgb3JkZXJlZCBieSBzaXplIGZyb20gYmlnZ2VyIGNsb25lcyB0byBzbWFsbGVyIGNsb25lcyAoeC1heGlzLCBSYW5rKS4KVGhlIEFidW5kYW5jZSBvZiBlYWNoIGNsb25lIHdhcyByZXByZXNlbnRlZCBhcyB0aGUgcGVyY2VudGFnZSBvZiB1bmlxdWUgc2VxdWVuY2VzIGluIHRoZSBjbG9uZSwgd2l0aCByZXNwZWN0IHRvIHRoZSB0b3RhbApudW1iZXIgb2YgdW5pcXVlIHNlcXVlbmNlcyBpbiB0aGF0IHN1YmplY3QgKEJ5IFBhdGllbnQpIG9yIGluIHRoZSBCLWNlbGwgb3IgVC1jZWxsIHNhbXBsZSAoQnkgQ2VsbCBQb3B1bGF0aW9uKS4KClRvIGNvcnJlY3QgZm9yIHRoZSBkaWZmZXJlbnQgbnVtYmVyIG9mIHNlcXVlbmNlcyBpbiBlYWNoIG9mIHRoZSBzYW1wbGVzLCB0aGUgQm9vdHN0cmFwcGluZyB0ZWNobmlxdWUgd2FzIGVtcGxveWVkLAppbiB3aGljaCBgciBuYm9vdGAgcmFuZG9tIGJvb3RzdHJhcCBzYW1wbGVzIHdlcmUgdGFrZW4sIHdpdGggc2l6ZSB0aGUgbnVtYmVyIG9mIHNlcXVlbmNlcyBpbiB0aGUgc2FtcGxlIHdpdGggbGVzcyBzZXF1ZW5jZXMgKE4pLgpUaGUgc29saWQgbGluZSBzaG93cyB0aGUgbWVhbiBBYnVuZGFuY2Ugb2YgdGhlIGJvb3RzdHJhcCBzYW1wbGVzLCB3aGVyZWFzIHRoZSB0cmFuc3BhcmVudCBhcmVhIHNob3dzIHRoZSBmdWxsIEFidW5kYW5jZQpyYW5nZSBvZiB0aGUgYm9vdHN0cmFwIHNhbXBsZXMuCgpBbGwgY2xvbmFsIGFidW5kYW5jZSBwbG90cyBhbmQgdGFibGVzIHdpdGggYWJ1bmRhbmNlIHZhbHVlcyBjYW4gYmUgZm91bmQgdW5kZXIgYHJlcGVydG9pcmVfYW5hbHlzaXMvQWJ1bmRhbmNlYC4KCiMjIENsb25hbCBhYnVuZGFuY2UgcGVyIHN1YmplY3QKYGBge3IgY2xvbmFsX2FidW5kYW5jZSwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KYWJ1bmQgPC0gZXN0aW1hdGVBYnVuZGFuY2UoZGZfYWxsLCBncm91cCA9ICJzYW1wbGUiLCBjaT0wLjk1LCBuYm9vdD1uYm9vdCkKYWJ1bmRAYWJ1bmRhbmNlJHRyZWF0bWVudCA8LSBzYXBwbHkoYWJ1bmRAYWJ1bmRhbmNlJHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCmFidW5kQGFidW5kYW5jZSR0aW1lX3BvaW50IDwtIHNhcHBseShhYnVuZEBhYnVuZGFuY2Ukc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsyXSkKYWJ1bmRAYWJ1bmRhbmNlJHBhdGllbnQgPC0gc2FwcGx5KGFidW5kQGFidW5kYW5jZSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQphYnVuZF9tYWluIDwtIHBhc3RlMCgiQ2xvbmFsIGFidW5kYW5jZSAoTj0iLCBhYnVuZEBuWzFdLCAiKSIpCmBgYApgYGB7ciBjbG9uYWxfYWJ1bmRhbmNlMiwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9MTIsIGVjaG89RkFMU0V9CnBfY2EgPC0gZ2dwbG90KGFidW5kQGFidW5kYW5jZSwgYWVzKHggPSByYW5rLCB5ID0gcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzYW1wbGUpKSArCiAgICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvd2VyLAogICAgICAgICAgICAgICAgICAgIHltYXggPSB1cHBlciwgZmlsbCA9IHRpbWVfcG9pbnQpLCBhbHBoYSA9IDAuNCkgKwogICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHRpbWVfcG9pbnQpKSArCiAgICBnZ3RpdGxlKGFidW5kX21haW4pICsKICAgIHhsYWIoIlJhbmsiKSArIHlsYWIoIkFidW5kYW5jZSIpICsKICAgIHNjYWxlX3hfbG9nMTAobGltaXRzID0gTlVMTCwKICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNjYWxlczo6dHJhbnNfYnJlYWtzKCJsb2cxMCIsIGZ1bmN0aW9uKHgpIDEwXngpLAogICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjp0cmFuc19mb3JtYXQoImxvZzEwIiwgc2NhbGVzOjptYXRoX2Zvcm1hdCgxMF4ueCkpKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKHBhdGllbnQpLCByb3dzID0gdmFycyh0cmVhdG1lbnQpLCBzY2FsZXM9ImZyZWUiLCBkcm9wID0gVCkKcF9jYQpgYGAKCmBgYHtyIGluY2x1ZGUgPSBGQUxTRX0KZ2dzYXZlKHBsb3Q9cF9jYSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9hYnVuZGFuY2Vfc3ViamVjdC5wZGYiKSwgZGV2aWNlPSJwZGYiLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdD1wX2NhLCBmaWxlbmFtZSA9IHBhc3RlMChhYnVuZGFuY2VfZGlyLCIvQ2xvbmFsX2FidW5kYW5jZV9zdWJqZWN0LnBuZyIpLCBkZXZpY2U9InBuZyIsIHdpZHRoID0gMjUsIGhlaWdodCA9IDYsIHVuaXRzPSJjbSIpCndyaXRlLnRhYmxlKGFidW5kQGFidW5kYW5jZSwgZmlsZSA9IHBhc3RlMChhYnVuZGFuY2VfZGlyLCAiL0Nsb25hbF9hYnVuZGFuY2VfZGF0YV9zdWJqZWN0LnRzdiIpLCBzZXA9Ilx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQpgYGAKCiMjIENvdW50IGNsb25lcyBwZXIgc3ViamVjdAoKYGBge3IgY291bnRfY2xvbmVzfQpkZl9jb3VudGNsb25lc19jb3B5IDwtIGNvdW50Q2xvbmVzKGRmX2FsbCxncm91cHM9InNhbXBsZSIsY29weSA9ICJkdXBsaWNhdGVfY291bnQiKQpkZl9jb3VudGNsb25lc19jb3B5JHRyZWF0bWVudCA8LSBzYXBwbHkoZGZfY291bnRjbG9uZXNfY29weSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpkZl9jb3VudGNsb25lc19jb3B5JHRpbWVfcG9pbnQgPC0gc2FwcGx5KGRmX2NvdW50Y2xvbmVzX2NvcHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsyXSkKZGZfY291bnRjbG9uZXNfY29weSRwYXRpZW50IDwtIHNhcHBseShkZl9jb3VudGNsb25lc19jb3B5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCndyaXRlLnRhYmxlKGRmX2NvdW50Y2xvbmVzX2NvcHksIGZpbGUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwgIi9DbG9uYWxfbnVtYmVyc19kYXRhX3N1YmplY3QudHN2IiksIHNlcCA9ICJcdCIsIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKYGBgCgojIyBDbG9uYWwgYWJ1bmRhbmNlIHBlciBjZWxsIHBvcHVsYXRpb24KCklmIGRpZmZlcmVudCB0eXBlcyBvZiBCLWNlbGwgb3IgVC1jZWxsIHBvcHVsYXRpb25zIGFyZSBwcm92aWRlZCwgaGVyZQp0aGUgY2xvbmFsIGFidW5kYW5jZSBpcyBwbG90dGVkIGZvciBlYWNoIHBhdGllbnQgYW5kIEIgLyBULWNlbGwgcG9wdWxhdGlvbi4KCmBgYHtyIGNsb25hbF9hYnVuZGFuY2VfcG9wLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQoKYWJ1bmRfcG9wIDwtIGVzdGltYXRlQWJ1bmRhbmNlKGRmX2FsbCwgY2xvbmU9ImNsb25lX2lkIiwgZ3JvdXAgPSAic2FtcGxlX3BvcCIsIGNpPTAuOTUsIG5ib290PW5ib290KQphYnVuZF9wb3BAYWJ1bmRhbmNlJHRyZWF0bWVudCA8LSBzYXBwbHkoYWJ1bmRfcG9wQGFidW5kYW5jZSRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsxXSkKYWJ1bmRfcG9wQGFidW5kYW5jZSR0aW1lX3BvaW50IDwtIHNhcHBseShhYnVuZF9wb3BAYWJ1bmRhbmNlJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQphYnVuZF9wb3BAYWJ1bmRhbmNlJHBhdGllbnQgPC0gc2FwcGx5KGFidW5kX3BvcEBhYnVuZGFuY2Ukc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCmFidW5kX3BvcEBhYnVuZGFuY2UkcG9wdWxhdGlvbiA8LSBzYXBwbHkoYWJ1bmRfcG9wQGFidW5kYW5jZSRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVs0XSkKYWJ1bmRfbWFpbiA8LSBwYXN0ZTAoIkNsb25hbCBhYnVuZGFuY2UgKE49IiwgYWJ1bmRfcG9wQG5bMV0sICIpIikKYGBgCgpgYGB7ciBjbG9uYWxfYWJ1bmRhbmNlX3BvcDIsIGZpZy53aWR0aD0xMiwgZWNobz1GQUxTRX0KYWJ1bmRfcG9wQGFidW5kYW5jZSRwb3B1bGF0aW9uIDwtIGZhY3RvcihhYnVuZF9wb3BAYWJ1bmRhbmNlJHBvcHVsYXRpb24sIGxldmVscyA9IGMoIk4iLCAiTSIsICJETiIsICJQIikpCmFidW5kX3BvcEBhYnVuZGFuY2UkdGltZV9wb2ludCA8LSBmYWN0b3IoYWJ1bmRfcG9wQGFidW5kYW5jZSR0aW1lX3BvaW50LCBsZXZlbHMgPSBjKCJiYXNlbGluZSIsICI2bW9udGhzIiwgIjEybW9udGhzIikpCnBvcF9jYSA8LSBnZ3Bsb3QoYWJ1bmRfcG9wQGFidW5kYW5jZSwgYWVzKHggPSByYW5rLCB5ID0gcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IHNhbXBsZV9wb3ApKSArCiAgICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvd2VyLAogICAgICAgICAgICAgICAgICAgIHltYXggPSB1cHBlciwgZmlsbCA9IHRpbWVfcG9pbnQpLCBhbHBoYSA9IDAuNCkgKwogICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHRpbWVfcG9pbnQpKSArCiAgICBnZ3RpdGxlKGFidW5kX21haW4pICsKICAgIHhsYWIoIlJhbmsiKSArIHlsYWIoIkFidW5kYW5jZSIpICsgCiAgICBsYWJzKGNvbG9yPSJUaW1lIFBvaW50IiwgZmlsbD0iVGltZSBQb2ludCIpICsKICAgIHNjYWxlX3hfbG9nMTAobGltaXRzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzY2FsZXM6OnRyYW5zX2JyZWFrcygibG9nMTAiLCBmdW5jdGlvbih4KSAxMF54KSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OnRyYW5zX2Zvcm1hdCgibG9nMTAiLCBzY2FsZXM6Om1hdGhfZm9ybWF0KDEwXi54KSkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBhdGllbnQpLCByb3dzPXZhcnMocG9wdWxhdGlvbiksIHNjYWxlcz0iZnJlZSIsIGRyb3AgPSBUKQpwb3BfY2EKYGBgCmBgYHtyIGluY2x1ZGU9RkFMU0V9Cmdnc2F2ZShwbG90PXBvcF9jYSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9hYnVuZGFuY2VfcGF0aWVudF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90PXBvcF9jYSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9hYnVuZGFuY2VfcGF0aWVudF9wb3B1bGF0aW9uLnBuZyIpLCBkZXZpY2U9InBuZyIsCiAgICAgICAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzPSJjbSIpCndyaXRlLnRhYmxlKGFidW5kX3BvcEBhYnVuZGFuY2UsIGZpbGUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwgIi9DbG9uYWxfYWJ1bmRhbmNlX2RhdGFfY2VsbF9wb3B1bGF0aW9uLnRzdiIpLCBzZXA9Ilx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQoKYGBgCgojIyBDb3VudCBjbG9uZXMgcGVyIHBvcHVsYXRpb24KCmBgYHtyIGNvdW50X2Nsb25lc19wb3BfMiwgZWNobz1GfQpjb3VudF9jbG9uZXNfcG9wIDwtIGNvdW50Q2xvbmVzKGRmX2FsbCwgZ3JvdXBzID0gInNhbXBsZV9wb3AiLCBjb3B5ID0gImR1cGxpY2F0ZV9jb3VudCIpCgpjb3VudF9jbG9uZXNfcG9wJHRyZWF0bWVudCA8LSBzYXBwbHkoY291bnRfY2xvbmVzX3BvcCRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsxXSkKY291bnRfY2xvbmVzX3BvcCR0aW1lX3BvaW50IDwtIHNhcHBseShjb3VudF9jbG9uZXNfcG9wJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpjb3VudF9jbG9uZXNfcG9wJHBhdGllbnQgPC0gc2FwcGx5KGNvdW50X2Nsb25lc19wb3Akc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCndyaXRlLnRhYmxlKGNvdW50X2Nsb25lc19wb3AsIGZpbGUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwgIi9DbG9uYWxfbnVtYmVyc19kYXRhX3N1YmplY3RfcG9wdWxhdGlvbi50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQoKYGBgCgojIyBDbG9uYWwgZGl2ZXJzaWZpY2F0aW9uIGluZGV4CgpgYGB7ciBjbG9uYWxfZGl2ZXJzaWZpY2F0aW9uLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQoKIyBDYWxjdWxhdGUgZ2luaSBpbmRleApjbG9uYWxfZGl2ZXJzaWZpY2F0aW9uX2luZGV4IDwtIGZ1bmN0aW9uKGRmKXsKICAjIENvbXB1dGluZyBjdW11bGF0aXZlIGZyZXF1ZW5jZSBkaXN0cmlidXRpb24KICBjbG9uZV9zZXF1ZW5jZXMgPC0gZGYkc2VxX2NvdW50CiAgUl92ZWMgPC0gYygpCiAgbiA9IDAKICBmb3IgKGogaW4gY2xvbmVfc2VxdWVuY2VzKXsKICAgIG4gPSBuICsgagogICAgUl92ZWMgPC0gYXBwZW5kKFJfdmVjLG4pCiAgfQogIFJfdmVjX25vcm0gPC0gUl92ZWMgLyBuCiAgCiAgbSA9IDAKICBnID0gMAogIGZvciAoaSBpbiBjKDE6bGVuZ3RoKFJfdmVjX25vcm0pKSl7CiAgICBnID0gZyArIChSX3ZlY19ub3JtW2ldIC0gaS9sZW5ndGgoUl92ZWNfbm9ybSkpCiAgfQogIGdpbmlfaW5kZXggPSBnL2xlbmd0aChSX3ZlY19ub3JtKQogIHJldHVybihnaW5pX2luZGV4KQp9CgpjbG9uYWxfZGl2ZXJzaWZpY2F0aW9uX21lYW4gPC0gYygpCmNsb25hbF9kaXZlcnNpZmljYXRpb25fc3RkIDwtIGMoKQpzYW1wbGVfbmFtZSA8LSBjKCkKY2xvbmVzX3NhbXBsZV9wb3AgPC0gc3BsaXQoY291bnRfY2xvbmVzX3BvcCwgY291bnRfY2xvbmVzX3BvcCRzYW1wbGVfcG9wKQojIFJlbW92aW5nIENMQUQ0ICBOCmNsb25lc19zYW1wbGVfcG9wJENsYWRyaWJpbl9iYXNlbGluZV9DTEFENF9OIDwtIE5VTEwKY2xvbmVzX3NhbXBsZV9wb3AkQ2xhZHJpYmluXzEybW9udGhzX0NMQUQ0X04gPC0gTlVMTApjbG9uZXNfc2FtcGxlX3BvcCRDbGFkcmliaW5fNm1vbnRoc19DTEFENF9OIDwtIE5VTEwKY2xvbmVOIDwtIGNvdW50KGNvdW50X2Nsb25lc19wb3AsIHZhcnM9InNhbXBsZV9wb3AiKQpzYW1wbGVfc2l6ZSA8LSBtaW4oY2xvbmVOJG4pCgojIENhbGN1bGF0ZSBnaW5pIGluZGV4IGZvciBib290c3RyYXAgc2FtcGxlcwpmb3IgKGkgaW4gYygxOmxlbmd0aChjbG9uZXNfc2FtcGxlX3BvcCkpKSB7CiAgZ2lfYm9vdCA8LSBjKCkKICBmb3IgKHIgaW4gYygxOm5ib290KSkgewogICAgIyBzYW1wbGUgTiBjbG9uZXMgYWNjb3JkaW5nIHRvIHNhbXBsZSBzaXplCiAgICBzYW1wbGVfZGYgPC0gc2FtcGxlX24oY2xvbmVzX3NhbXBsZV9wb3BbW2ldXSwgc2l6ZSA9IHNhbXBsZV9zaXplLCByZXBsYWNlID0gRiwgd2VpZ2h0ID0gY2xvbmVzX3NhbXBsZV9wb3BbW2ldXSRzZXFfZnJlcSkKICAgIGdpIDwtIGNsb25hbF9kaXZlcnNpZmljYXRpb25faW5kZXgoc2FtcGxlX2RmKQogICAgZ2lfYm9vdCA8LSBhcHBlbmQoZ2lfYm9vdCwgZ2kpCiAgfQogIGNsb25hbF9kaXZlcnNpZmljYXRpb25fbWVhbiA8LSBhcHBlbmQoY2xvbmFsX2RpdmVyc2lmaWNhdGlvbl9tZWFuLCBtZWFuKGdpX2Jvb3QpKQogIGNsb25hbF9kaXZlcnNpZmljYXRpb25fc3RkIDwtIGFwcGVuZChjbG9uYWxfZGl2ZXJzaWZpY2F0aW9uX3N0ZCwgc2QoZ2lfYm9vdCkpCiAgc2FtcGxlX25hbWUgPC0gYXBwZW5kKHNhbXBsZV9uYW1lLCBuYW1lcyhjbG9uZXNfc2FtcGxlX3BvcClbaV0pCn0KCmRmX2dpbmlfaW5kZXggPC0gZGF0YS5mcmFtZShzYW1wbGVfcG9wID0gc2FtcGxlX25hbWUsIGNsb25hbF9kaXZlcnNpZmljYXRpb25fbWVhbiA9IGNsb25hbF9kaXZlcnNpZmljYXRpb25fbWVhbiwgY2xvbmFsX2RpdmVyc2lmaWNhdGlvbl9zdGQgPSBjbG9uYWxfZGl2ZXJzaWZpY2F0aW9uX3N0ZCkKZGZfZ2luaV9pbmRleCR0cmVhdG1lbnQgPC0gc2FwcGx5KGRmX2dpbmlfaW5kZXgkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCmRmX2dpbmlfaW5kZXgkdGltZV9wb2ludCA8LSBzYXBwbHkoZGZfZ2luaV9pbmRleCRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsyXSkKZGZfZ2luaV9pbmRleCRwYXRpZW50IDwtIHNhcHBseShkZl9naW5pX2luZGV4JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQpkZl9naW5pX2luZGV4JHBvcHVsYXRpb24gPC0gc2FwcGx5KGRmX2dpbmlfaW5kZXgkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbNF0pCmRmX2dpbmlfaW5kZXgkdGltZV9wb2ludCA8LSBmYWN0b3IoZGZfZ2luaV9pbmRleCR0aW1lX3BvaW50LCBjKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpKQpkZl9naW5pX2luZGV4JHBvcHVsYXRpb24gPC0gZmFjdG9yKGRmX2dpbmlfaW5kZXgkcG9wdWxhdGlvbiwgYygiTiIsICJNIiwgIkROIiwgIlAiKSkKCndyaXRlLnRhYmxlKGRmX2dpbmlfaW5kZXgsIHBhc3RlMChhYnVuZGFuY2VfZGlyLCAiL0Nsb25hbF9kaXZlcnNpZmljYXRpb25faW5kZXhfdGFibGUudHN2IiksCiAgICAgICAgICAgIHNlcD0iXHQiLCBxdW90ZSA9IEYsIHJvdy5uYW1lcyA9IEYpCgpgYGAKCmBgYHtyIGNsb25hbF9kaXZlcnNpZmljYXRpb25fYm94cGxvdCwgZmlnLndpZHRoPTYsIGZpZy5hc3A9MC41LCBlY2hvPUZBTFNFfQojIGJveHBsb3RfZ2luaSA8LSBnZ3Bsb3QoZGZfZ2luaV9pbmRleCwgYWVzKHk9Y2xvbmFsX2RpdmVyc2lmaWNhdGlvbl9tZWFuLCB4PXRpbWVfcG9pbnQpKSArCiMgICAgIGdlb21fYm94cGxvdCgpICsKIyAgICAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsIHNpemUgPSAxKSArCiMgICAgICNnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWQtZF9zZCwgeW1heD1kK2Rfc2QpLCB3aWR0aCA9IC4yLCBwb3NpdGlvbj1kb2RnZSkgKwojICAgICB4bGFiKCIiKSArIHlsYWIoIkNsb25hbCBkaXZlcnNpZmljYXRpb24iKSArCiMgICAgIGdndGl0bGUocGFzdGUwKCJDbG9uYWwgZGl2ZXJzaWZpY2F0aW9uIGluZGV4IChOID0gIixzYW1wbGVfc2l6ZSwiKSIpKSArCiMgICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBvcHVsYXRpb24pLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIikgKwojICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQojIGJveHBsb3RfZ2luaQoKIyBCb3hwbG90IHdpdGggV2lsY294b24gcGFpcmVkIHRlc3RzIChnZ3B1YnIpCm15X2NvbXBhcmlzb25zIDwtIGxpc3QoIGMoImJhc2VsaW5lIiwgIjZtb250aHMiKSwgYygiNm1vbnRocyIsICIxMm1vbnRocyIpLCBjKCJiYXNlbGluZSIsICIxMm1vbnRocyIpICkKCmJveHBsb3RfZ2luaSA8LSBnZ2JveHBsb3QoZGZfZ2luaV9pbmRleCwgeCA9ICJ0aW1lX3BvaW50IiwgeSA9ICJjbG9uYWxfZGl2ZXJzaWZpY2F0aW9uX21lYW4iLAogICAgICAgIGFkZCA9ICJqaXR0ZXIiLCBsZWdlbmQgPSAibm9uZSIsCiAgICAgICAgIGNvbG9yID0gInRpbWVfcG9pbnQiLCBsaW5lLmNvbG9yID0gImdyYXkiLCBsaW5lLnNpemUgPSAwLjQsCiAgICAgICAgIGZhY2V0LmJ5ID0gInBvcHVsYXRpb24iLCBuY29sID0gNCwgc2hvcnQucGFuZWwubGFicyA9IFQpICsKICAgICAgICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkIiLCAiNk0iLCAiMTJNIikpICsKICAgICAgICAjdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3Q9MSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgIHhsYWIoIiIpICsgeWxhYigiQ2xvbmFsIGRpdmVyc2lmaWNhdGlvbiIpICsKICAgICAgICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgcGFpcmVkID1ULCBtZXRob2QgPSAid2lsY294IiwgbGFiZWw9InAuc2lnbmlmIikgKwogICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbD0icC5mb3JtYXQiLCBsYWJlbC55PTAuNikKYm94cGxvdF9naW5pCgpib3hwbG90X2dpbmlfbm9rcnVza2FsIDwtIGdnYm94cGxvdChkZl9naW5pX2luZGV4LCB4ID0gInRpbWVfcG9pbnQiLCB5ID0gImNsb25hbF9kaXZlcnNpZmljYXRpb25fbWVhbiIsCiAgICAgICAgYWRkID0gImppdHRlciIsIGxlZ2VuZCA9ICJub25lIiwKICAgICAgICAgY29sb3IgPSAidGltZV9wb2ludCIsIGxpbmUuY29sb3IgPSAiZ3JheSIsIGxpbmUuc2l6ZSA9IDAuNCwKICAgICAgICAgZmFjZXQuYnkgPSAicG9wdWxhdGlvbiIsIG5jb2wgPSA0LCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgeGxhYigiIikgKyB5bGFiKCJDbG9uYWwgZGl2ZXJzaWZpY2F0aW9uIikgKwogICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBwYWlyZWQgPVQsIG1ldGhvZCA9ICJ3aWxjb3giLCBsYWJlbD0icC5zaWduaWYiKQpib3hwbG90X2dpbmlfbm9rcnVza2FsCmBgYAoKYGBge3IsIGVjaG89Rn0KZ2dzYXZlKHBsb3Q9Ym94cGxvdF9naW5pLCBmaWxlbmFtZSA9IHBhc3RlMChhYnVuZGFuY2VfZGlyLCIvQ2xvbmFsX2RpdmVyc2lmaWNhdGlvbl9pbmRleF9wYXRpZW50X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwgCiAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSA3LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdD1ib3hwbG90X2dpbmksIGZpbGVuYW1lID0gcGFzdGUwKGFidW5kYW5jZV9kaXIsIi9DbG9uYWxfZGl2ZXJzaWZpY2F0aW9uX2luZGV4X3BhdGllbnRfcG9wdWxhdGlvbi5wZGYiKSwgZGV2aWNlPSJwZGYiLCAKICAgICAgIHdpZHRoPTIwLCBoZWlnaHQ9NywgdW5pdHM9ImNtIikKCmBgYAoKCgoKYGBge3IgY2xvbmFsX3NpemVzLCBlY2hvID0gRn0KCiMgQ2FsY3VsYXRlIGNsb25hbCBzaXplIHBlcmNlbnRhZ2VzCmNsb25lX3BlcmNlbnRhZ2VfZ3Rfc2l6ZSA8LSBmdW5jdGlvbihkZiwgc2l6ZSl7CiAgIyBDb21wdXRpbmcgY3VtdWxhdGl2ZSBmcmVxdWVuY2UgZGlzdHJpYnV0aW9uCiAgY2xvbmVfc2VxdWVuY2VzIDwtIGRmJHNlcV9jb3VudAogIGRmX3NpemUgPC0gZGZbd2hpY2goY2xvbmVfc2VxdWVuY2VzID49IHNpemUpLF0KICBjbG9uZV9OIDwtIG5yb3coZGYpCiAgY2xvbmVfc2l6ZV9OIDwtIG5yb3coZGZfc2l6ZSkKICBwZXJjZW50YWdlX3NpemUgPC0gY2xvbmVfc2l6ZV9OICogMTAwIC8gY2xvbmVfTgogIHJldHVybihwZXJjZW50YWdlX3NpemUpCn0KCnBlcmNlbnRhZ2VfZ3RfMiA8LSBjKCkKcGVyY2VudGFnZV9ndF81IDwtIGMoKQpwZXJjZW50YWdlX2d0XzEwIDwtIGMoKQpwZXJjZW50YWdlX2d0XzUwIDwtIGMoKQpwZXJjZW50YWdlX2d0XzEwMCA8LSBjKCkKcGVyY2VudGFnZV9ndF81MDAgPC0gYygpCnBlcmNlbnRhZ2VfZ3RfMTAwMCA8LSBjKCkKcGVyY2VudGFnZV9ndF8yIDwtIGMoKQpzZF9wZXJjZW50YWdlX2d0XzIgPC0gYygpCnNkX3BlcmNlbnRhZ2VfZ3RfNSA8LSBjKCkKc2RfcGVyY2VudGFnZV9ndF8xMCA8LSBjKCkKc2RfcGVyY2VudGFnZV9ndF81MCA8LSBjKCkKc2RfcGVyY2VudGFnZV9ndF8xMDAgPC0gYygpCnNkX3BlcmNlbnRhZ2VfZ3RfNTAwIDwtIGMoKQpzZF9wZXJjZW50YWdlX2d0XzEwMDAgPC0gYygpCgpzYW1wbGVfbmFtZSA8LSBjKCkKY2xvbmVzX3NhbXBsZV9wb3AgPC0gc3BsaXQoY291bnRfY2xvbmVzX3BvcCwgY291bnRfY2xvbmVzX3BvcCRzYW1wbGVfcG9wKQpjbG9uZXNfc2FtcGxlX3BvcCRDbGFkcmliaW5fYmFzZWxpbmVfQ0xBRDRfTiA8LSBOVUxMCmNsb25lc19zYW1wbGVfcG9wJENsYWRyaWJpbl8xMm1vbnRoc19DTEFENF9OIDwtIE5VTEwKY2xvbmVzX3NhbXBsZV9wb3AkQ2xhZHJpYmluXzZtb250aHNfQ0xBRDRfTiA8LSBOVUxMCmNsb25lTiA8LSBjb3VudChjb3VudF9jbG9uZXNfcG9wLCB2YXJzPSJzYW1wbGVfcG9wIikKc2FtcGxlX3NpemUgPC0gbWluKGNsb25lTiRuKQoKZm9yIChpIGluIGMoMTpsZW5ndGgoY2xvbmVzX3NhbXBsZV9wb3ApKSkgewogIHBlcmNlbnRhZ2VfZ3RfMl9ib290IDwtIGMoKQogIHBlcmNlbnRhZ2VfZ3RfNV9ib290IDwtIGMoKQogIHBlcmNlbnRhZ2VfZ3RfMTBfYm9vdCA8LSBjKCkKICBwZXJjZW50YWdlX2d0XzUwX2Jvb3QgPC0gYygpCiAgcGVyY2VudGFnZV9ndF8xMDBfYm9vdCA8LSBjKCkKICBwZXJjZW50YWdlX2d0XzUwMF9ib290IDwtIGMoKQogIHBlcmNlbnRhZ2VfZ3RfMTAwMF9ib290IDwtIGMoKQogIGZvciAociBpbiBjKDE6bmJvb3QpKSB7CiAgICBzYW1wbGVfZGYgPC0gc2FtcGxlX24oY2xvbmVzX3NhbXBsZV9wb3BbW2ldXSwgc2l6ZSA9IHNhbXBsZV9zaXplLCByZXBsYWNlID0gRiwgd2VpZ2h0ID0gY2xvbmVzX3NhbXBsZV9wb3BbW2ldXSRzZXFfZnJlcSkKICAgIHBlcmNlbnRhZ2VfZ3RfMl9ib290IDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzJfYm9vdCwgY2xvbmVfcGVyY2VudGFnZV9ndF9zaXplKHNhbXBsZV9kZiwgMikpCiAgICBwZXJjZW50YWdlX2d0XzVfYm9vdCA8LSBhcHBlbmQocGVyY2VudGFnZV9ndF81X2Jvb3QsIGNsb25lX3BlcmNlbnRhZ2VfZ3Rfc2l6ZShzYW1wbGVfZGYsIDUpKQogICAgcGVyY2VudGFnZV9ndF8xMF9ib290IDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzEwX2Jvb3QsIGNsb25lX3BlcmNlbnRhZ2VfZ3Rfc2l6ZShzYW1wbGVfZGYsIDEwKSkKICAgIHBlcmNlbnRhZ2VfZ3RfNTBfYm9vdCA8LSBhcHBlbmQocGVyY2VudGFnZV9ndF81MF9ib290LCBjbG9uZV9wZXJjZW50YWdlX2d0X3NpemUoc2FtcGxlX2RmLCA1MCkpCiAgICBwZXJjZW50YWdlX2d0XzEwMF9ib290IDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzEwMF9ib290LCBjbG9uZV9wZXJjZW50YWdlX2d0X3NpemUoc2FtcGxlX2RmLCAxMDApKQogICAgcGVyY2VudGFnZV9ndF81MDBfYm9vdCA8LSBhcHBlbmQocGVyY2VudGFnZV9ndF81MDBfYm9vdCwgY2xvbmVfcGVyY2VudGFnZV9ndF9zaXplKHNhbXBsZV9kZiwgNTAwKSkKICAgIHBlcmNlbnRhZ2VfZ3RfMTAwMF9ib290IDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzEwMDBfYm9vdCxjbG9uZV9wZXJjZW50YWdlX2d0X3NpemUoc2FtcGxlX2RmLCAxMDAwKSkKICB9CiAgcGVyY2VudGFnZV9ndF8yIDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzIsIG1lYW4ocGVyY2VudGFnZV9ndF8yX2Jvb3QpKQogIHBlcmNlbnRhZ2VfZ3RfNSA8LSBhcHBlbmQocGVyY2VudGFnZV9ndF81LCBtZWFuKHBlcmNlbnRhZ2VfZ3RfNV9ib290KSkKICBwZXJjZW50YWdlX2d0XzEwIDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzEwLCBtZWFuKHBlcmNlbnRhZ2VfZ3RfMTBfYm9vdCkpCiAgcGVyY2VudGFnZV9ndF81MCA8LSBhcHBlbmQocGVyY2VudGFnZV9ndF81MCwgbWVhbihwZXJjZW50YWdlX2d0XzUwX2Jvb3QpKQogIHBlcmNlbnRhZ2VfZ3RfMTAwIDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzEwMCwgbWVhbihwZXJjZW50YWdlX2d0XzEwMF9ib290KSkKICBwZXJjZW50YWdlX2d0XzUwMCA8LSBhcHBlbmQocGVyY2VudGFnZV9ndF81MDAsIG1lYW4ocGVyY2VudGFnZV9ndF81MDBfYm9vdCkpCiAgcGVyY2VudGFnZV9ndF8xMDAwIDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzEwMDAsIG1lYW4ocGVyY2VudGFnZV9ndF8xMDAwX2Jvb3QpKQogIHNkX3BlcmNlbnRhZ2VfZ3RfMiA8LSBhcHBlbmQoc2RfcGVyY2VudGFnZV9ndF8yLCBzZChwZXJjZW50YWdlX2d0XzJfYm9vdCkpCiAgc2RfcGVyY2VudGFnZV9ndF81IDwtIGFwcGVuZChzZF9wZXJjZW50YWdlX2d0XzUsIHNkKHBlcmNlbnRhZ2VfZ3RfNV9ib290KSkKICBzZF9wZXJjZW50YWdlX2d0XzEwIDwtIGFwcGVuZChzZF9wZXJjZW50YWdlX2d0XzEwLCBzZChwZXJjZW50YWdlX2d0XzEwX2Jvb3QpKQogIHNkX3BlcmNlbnRhZ2VfZ3RfNTAgPC0gYXBwZW5kKHNkX3BlcmNlbnRhZ2VfZ3RfNTAsIHNkKHBlcmNlbnRhZ2VfZ3RfNTBfYm9vdCkpCiAgc2RfcGVyY2VudGFnZV9ndF8xMDAgPC0gYXBwZW5kKHNkX3BlcmNlbnRhZ2VfZ3RfMTAwLCBzZChwZXJjZW50YWdlX2d0XzEwMF9ib290KSkKICBzZF9wZXJjZW50YWdlX2d0XzUwMCA8LSBhcHBlbmQoc2RfcGVyY2VudGFnZV9ndF81MDAsIHNkKHBlcmNlbnRhZ2VfZ3RfNTAwX2Jvb3QpKQogIHNkX3BlcmNlbnRhZ2VfZ3RfMTAwMCA8LSBhcHBlbmQoc2RfcGVyY2VudGFnZV9ndF8xMDAwLCBzZChwZXJjZW50YWdlX2d0XzEwMDBfYm9vdCkpCiAgc2FtcGxlX25hbWUgPC0gYXBwZW5kKHNhbXBsZV9uYW1lLCBuYW1lcyhjbG9uZXNfc2FtcGxlX3BvcClbaV0pCn0KCmNsb25lc19wZXJjZW50YWdlcyA8LSBkYXRhLmZyYW1lKHNhbXBsZV9wb3AgPSBzYW1wbGVfbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzIgPSBwZXJjZW50YWdlX2d0XzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzUgPSBwZXJjZW50YWdlX2d0XzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzEwID0gcGVyY2VudGFnZV9ndF8xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RfNTAgPSBwZXJjZW50YWdlX2d0XzUwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RfMTAwID0gcGVyY2VudGFnZV9ndF8xMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzUwMCA9IHBlcmNlbnRhZ2VfZ3RfNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndF8xMDAwID0gcGVyY2VudGFnZV9ndF8xMDAwKQpjbG9uZXNfcGVyY2VudGFnZXMgPC0gY2xvbmVzX3BlcmNlbnRhZ2VzICU+JSBkaXN0aW5jdChzYW1wbGVfcG9wLC5rZWVwX2FsbD1UKQpjbG9uZXNfc2RfcGVyY2VudGFnZXMgPC0gZGF0YS5mcmFtZShzYW1wbGVfcG9wID0gc2FtcGxlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzIgPSBzZF9wZXJjZW50YWdlX2d0XzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzUgPSBzZF9wZXJjZW50YWdlX2d0XzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzEwID0gc2RfcGVyY2VudGFnZV9ndF8xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RfNTAgPSBzZF9wZXJjZW50YWdlX2d0XzUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndF8xMDAgPSBzZF9wZXJjZW50YWdlX2d0XzEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RfNTAwID0gc2RfcGVyY2VudGFnZV9ndF81MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzEwMDAgPSBzZF9wZXJjZW50YWdlX2d0XzEwMDApCmNsb25lc19zZF9wZXJjZW50YWdlcyA8LSBjbG9uZXNfc2RfcGVyY2VudGFnZXMgJT4lIGRpc3RpbmN0KHNhbXBsZV9wb3AsIC5rZWVwX2FsbD1UKQpjbG9uZXNfcGVyY2VudGFnZXNfbWVsdCA8LSBtZWx0KGRhdGEudGFibGUoY2xvbmVzX3BlcmNlbnRhZ2VzKSwgaWQgPSAic2FtcGxlX3BvcCIsIHZhbHVlLm5hbWUgPSAicGVyY2VudGFnZSIpCmNsb25lc19zZF9wZXJjZW50YWdlc19tZWx0IDwtIG1lbHQoZGF0YS50YWJsZShjbG9uZXNfc2RfcGVyY2VudGFnZXMpLCBpZD0ic2FtcGxlX3BvcCIsIHZhbHVlLm5hbWUgPSAic2QiKQoKY2xvbmVzX3BlcmNlbnRhZ2VzX2RmIDwtIG1lcmdlKHg9Y2xvbmVzX3BlcmNlbnRhZ2VzX21lbHQsIHk9Y2xvbmVzX3NkX3BlcmNlbnRhZ2VzX21lbHQsIGJ5PWMoInNhbXBsZV9wb3AiLCJ2YXJpYWJsZSIpKQoKCmNsb25lc19wZXJjZW50YWdlc19kZiR0cmVhdG1lbnQgPC0gc2FwcGx5KGNsb25lc19wZXJjZW50YWdlc19kZiRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsxXSkKY2xvbmVzX3BlcmNlbnRhZ2VzX2RmJHRpbWVfcG9pbnQgPC0gc2FwcGx5KGNsb25lc19wZXJjZW50YWdlc19kZiRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsyXSkKY2xvbmVzX3BlcmNlbnRhZ2VzX2RmJHRpbWVfcG9pbnQgPC0gZmFjdG9yKGNsb25lc19wZXJjZW50YWdlc19kZiR0aW1lX3BvaW50LGxldmVscz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpKQpjbG9uZXNfcGVyY2VudGFnZXNfZGYkcGF0aWVudCA8LSBzYXBwbHkoY2xvbmVzX3BlcmNlbnRhZ2VzX2RmJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQpjbG9uZXNfcGVyY2VudGFnZXNfZGYkcG9wdWxhdGlvbiA8LSBzYXBwbHkoY2xvbmVzX3BlcmNlbnRhZ2VzX2RmJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzRdKQoKY2xvbmVzX3BlcmNlbnRhZ2VzX2RmIDwtIGNsb25lc19wZXJjZW50YWdlc19kZiAlPiUgZGlzdGluY3QoKQoKd3JpdGUudGFibGUoY2xvbmVzX3BlcmNlbnRhZ2VzX2RmLCBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9zaXplX3BlcmNlbnRhZ2VfcGF0aWVudF9wb3B1bGF0aW9uX3RhYmxlLnRzdiIgKSwKICAgICAgICAgICAgc2VwPSJcdCIsIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKYGBgCgpgYGB7ciBjbG9uYWxfcGVyY2VudGFnZV9ib3hwbG90LCBmaWcud2lkdGg9NiwgZmlnLmFzcD0wLjUsZWNobz1GQUxTRX0KY2xvbmVzX3BlcmNlbnRhZ2Vfb25lX0MgPC0gY2xvbmVzX3BlcmNlbnRhZ2VzX2RmW3doaWNoKGNsb25lc19wZXJjZW50YWdlc19kZiR2YXJpYWJsZSAlaW4lIGMoImd0XzEwMCIpKSxdCmNsb25lc19wZXJjZW50YWdlX29uZV9DJHRpbWVfcG9pbnQgPC0gZmFjdG9yKGNsb25lc19wZXJjZW50YWdlX29uZV9DJHRpbWVfcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpKQpjbG9uZXNfcGVyY2VudGFnZV9vbmVfQyRwb3B1bGF0aW9uIDwtIGZhY3RvcihjbG9uZXNfcGVyY2VudGFnZV9vbmVfQyRwb3B1bGF0aW9uLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWMoIk4iLCAiTSIsICJETiIsICJQIikpCiMgYm94cGxvdF9jbG9uZV9zaXplIDwtIGdncGxvdChjbG9uZXNfcGVyY2VudGFnZV9vbmVfQywgYWVzKHk9cGVyY2VudGFnZSwgeD10aW1lX3BvaW50KSkgKwojICAgICBnZW9tX2JveHBsb3QoKSArCiMgICAgIGdlb21fcG9pbnQocG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDEpICsKIyAgICAgI2dlb21fZXJyb3JiYXIoYWVzKHltaW49ZC1kX3NkLCB5bWF4PWQrZF9zZCksIHdpZHRoID0gLjIsIHBvc2l0aW9uPWRvZGdlKSArCiMgICAgIHhsYWIoIiIpICsgeWxhYigiUGVyY2VudGFnZSIpICsKIyAgICAgZ2d0aXRsZShwYXN0ZTAoIkNsb25hbCBzaXplIHBlcmNlbnRhZ2UgKE4gPSAiLHNhbXBsZV9zaXplLCIpIGdyZWF0ZXIgdGhhbiAxMCIpKSArCiMgICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBvcHVsYXRpb24pLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIikgKwojICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQojIGJveHBsb3RfY2xvbmVfc2l6ZQoKbXlfY29tcGFyaXNvbnMgPC0gbGlzdCggYygiYmFzZWxpbmUiLCAiNm1vbnRocyIpLCBjKCI2bW9udGhzIiwgIjEybW9udGhzIiksIGMoImJhc2VsaW5lIiwgIjEybW9udGhzIikgKQoKYm94cGxvdF9jbG9uZV9zaXplIDwtIGdnYm94cGxvdChjbG9uZXNfcGVyY2VudGFnZV9vbmVfQywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9ICJ0aW1lX3BvaW50IiwgeSA9ICJwZXJjZW50YWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIiwgbGVnZW5kID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInRpbWVfcG9pbnQiLCBsaW5lLmNvbG9yID0gImdyYXkiLCBsaW5lLnNpemUgPSAwLjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXQuYnkgPSAicG9wdWxhdGlvbiIsIG5jb2wgPSA0LCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgICAgICAgICAgICAgICAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3M9YygiYmFzZWxpbmUiLCI2bW9udGhzIiwiMTJtb250aHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJCIiwgIjZNIiwgIjEyTSIpKSArCiAgICAgICAgI3RoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0PTEpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICB4bGFiKCIiKSArIHlsYWIoIiUgQ2xvbmVzID4gMTAwIikgKwogICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBwYWlyZWQgPVQsIG1ldGhvZCA9ICJ3aWxjb3giLCBsYWJlbD0icC5zaWduaWYiKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsPSJwLmZvcm1hdCIsIGxhYmVsLnkgPSAxOSkKCmJveHBsb3RfY2xvbmVfc2l6ZQoKYm94cGxvdF9jbG9uZV9zaXplX25va3J1c2thbCA8LSBnZ2JveHBsb3QoY2xvbmVzX3BlcmNlbnRhZ2Vfb25lX0MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAidGltZV9wb2ludCIsIHkgPSAicGVyY2VudGFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIsIGxlZ2VuZCA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ0aW1lX3BvaW50IiwgbGluZS5jb2xvciA9ICJncmF5IiwgbGluZS5zaXplID0gMC40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0LmJ5ID0gInBvcHVsYXRpb24iLCBuY29sID0gNCwgc2hvcnQucGFuZWwubGFicyA9IFQpICsKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgeGxhYigiIikgKyB5bGFiKCIlIENsb25lcyA+IDEwMCIpICsKICAgICAgICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgcGFpcmVkID1ULCBtZXRob2QgPSAid2lsY294IiwgbGFiZWw9InAuc2lnbmlmIikKYm94cGxvdF9jbG9uZV9zaXplX25va3J1c2thbApgYGAKCmBgYHtyLCBlY2hvPUZ9Cmdnc2F2ZShwbG90PWJveHBsb3RfY2xvbmVfc2l6ZSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25lc19wZXJjZW50YWdlc19ncmVhdGVyX3RoYW5fMTAwLnBuZyIpLCBkZXZpY2U9InBuZyIsIAogICAgICAgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNywgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3Q9Ym94cGxvdF9jbG9uZV9zaXplLCBmaWxlbmFtZSA9IHBhc3RlMChhYnVuZGFuY2VfZGlyLCIvQ2xvbmVzX3BlcmNlbnRhZ2VzX2dyZWF0ZXJfdGhhbl8xMDAucGRmIiksIGRldmljZT0icGRmIiwgCiAgICAgICB3aWR0aD0yMCwgaGVpZ2h0PTcsIHVuaXRzPSJjbSIpCmBgYAoKIyMgQ291bnQgY2xvbmVzIHBlciBwb3B1bGF0aW9uCgpgYGB7ciBjb3VudF9jbG9uZXNfcG9wfQpkZl9jb3VudGNsb25lc19jb3B5IDwtIGNvdW50Q2xvbmVzKGRmX2FsbCxncm91cHM9InNhbXBsZV9wb3AiLGNvcHkgPSAiZHVwbGljYXRlX2NvdW50IikKZGZfY291bnRjbG9uZXNfY29weSR0cmVhdG1lbnQgPC0gc2FwcGx5KGRmX2NvdW50Y2xvbmVzX2NvcHkkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCmRmX2NvdW50Y2xvbmVzX2NvcHkkdGltZV9wb2ludCA8LSBzYXBwbHkoZGZfY291bnRjbG9uZXNfY29weSRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsyXSkKZGZfY291bnRjbG9uZXNfY29weSRwYXRpZW50IDwtIHNhcHBseShkZl9jb3VudGNsb25lc19jb3B5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQpkZl9jb3VudGNsb25lc19jb3B5JHBvcHVsYXRpb24gPC0gc2FwcGx5KGRmX2NvdW50Y2xvbmVzX2NvcHkkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkKdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbNF0pCndyaXRlLnRhYmxlKGRmX2NvdW50Y2xvbmVzX2NvcHksIGZpbGUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwgIi9DbG9uYWxfbnVtYmVyc19kYXRhX3N1YmplY3RfcG9wdWxhdGlvbi50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQpgYGAKCiMgQ2xvbmFsIGRpdmVyc2l0eQoKVGhlIGNsb25hbCBkaXZlcnNpdHkgJEQkIG9mIHRoZSByZXBlcnRvaXJlIHdhcyBjYWxjdWxhdGVkIGFjY29yZGluZyB0byB0aGUgZ2VuZXJhbCBmb3JtdWxhIG9mIEhpbGwgRGl2ZXJzaXR5Cm51bWJlcnM6CgokJApcYmVnaW57YWxpZ25lZH0KICAgIF57cX1EID0gXGxlZnQoIFxzdW1fe2k9MX1eUnBfaV5xIFxyaWdodCleezEvKDEtcSl9ClxlbmR7YWxpZ25lZH0KJCQKCndoZXJlOgoKKiAkcF9pJCBpcyB0aGUgcHJvcG9ydGlvbiBvZiB1bmlxdWUgc2VxdWVuY2VzIGJlbG9uZ2luZyB0byBjbG9uZSAkaSQuCiogJHEkIGFyZSB0aGUgdmFsdWVzIG9mIHRoZSBkaWZmZXJlbnQgZGl2ZXJzaXR5IG51bWJlcnMuCiogJFIkIGlzIHRoZSBSaWNobmVzcywgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgY2xvbmVzIGluIHRoZSBzYW1wbGUuCgpBdCAkcT0xJCB0aGUgZnVuY3Rpb24gaXMgdW5kZWZpbmVkIGFuZCB0aGUgbGltaXQgdG8gemVybyBlcXVhbHMgdGhlIGV4cG9uZW50aWFsIG9mIHRoZSBTaGFubm9uIEVudHJvcHk6CgokJApcYmVnaW57YWxpZ25lZH0KICAgIF57MX1EID0gZXhwIFxsZWZ0KCAgXHN1bV97aT0xfV5ScF9pIGxuKHBfaSkgIFxyaWdodCkKXGVuZHthbGlnbmVkfQokJAoKVGhlIGludHVpdGlvbiBhYm91dCB0aGUgZGlmZmVyZW50IEhpbGwgRGl2ZXJzaXR5IHZhbHVlcyBpcyB0aGUgZm9sbG93aW5nOgoKKiBBdCAkcT0wJCB0aGUgZGl2ZXJzaXR5IGluZGV4IGVxdWFscyB0aGUgbnVtYmVyIG9mIGNsb25lcyBpbiB0aGUgc2FtcGxlLgoqIEF0ICRxPTEkIHRoZSBkaXZlcnNpdHkgaW5kZXggaXMgdGhlIGdlb21ldHJpYyBtZWFuIG9mIHRoZSBjbG9uZXMgaW4gdGhlIHNhbXBsZSwKd2VpZ2h0ZWQgYnkgdGhlaXIgcHJvcG9ydGlvbiBpbiB0aGUgc2FtcGxlLgoqIEF0ICRxPjEkIG1vcmUgd2VpZ2h0IGlzIGdpdmVuIHRvIHRoZSBjbG9uZXMgd2l0aCBoaWdoZXIgcHJvcG9ydGlvbnMgaW4gdGhlIHNhbXBsZS4KCkFsbCBjbG9uYWwgZGl2ZXJzaXR5IHBsb3RzIGFuZCB0YWJsZXMgd2l0aCBkaXZlcnNpdHkgdmFsdWVzIGNhbiBiZSBmb3VuZCB1bmRlciBgcmVwZXJ0b2lyZV9hbmFseXNpcy9EaXZlcnNpdHlgLgpUbyBjb3JyZWN0IGZvciB0aGUgZGlmZmVyZW50IG51bWJlciBvZiBzZXF1ZW5jZXMgaW4gZWFjaCBvZiB0aGUgc2FtcGxlcywgdGhlIEJvb3RzdHJhcHBpbmcgdGVjaG5pcXVlIHdhcyBlbXBsb3llZCwKaW4gd2hpY2ggYHIgbmJvb3RgIHJhbmRvbSBib290c3RyYXAgc2FtcGxlcyB3ZXJlIHRha2VuLCB3aXRoIHNpemUgdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgaW4gdGhlIHNhbXBsZSB3aXRoIGxlc3Mgc2VxdWVuY2VzIChOKS4KVGhlIHNvbGlkIGxpbmUgc2hvd3MgdGhlIG1lYW4gRGl2ZXJzaXR5IG9mIHRoZSBib290c3RyYXAgc2FtcGxlcywgd2hlcmVhcyB0aGUgdHJhbnNwYXJlbnQgYXJlYSBzaG93cyB0aGUgZnVsbCBEaXZlcnNpdHkKcmFuZ2Ugb2YgdGhlIGJvb3RzdHJhcCBzYW1wbGVzLgoKCiMjIENsb25hbCBkaXZlcnNpdHkgcGVyIHN1YmplY3QKYGBge3IgY2xvbmFsX2RpdmVyc2l0eSwgZWNobyA9IEZBTFNFLCBpbmNsdWRlPUZBTFNFfQpzYW1wbGVfZGl2IDwtIGFscGhhRGl2ZXJzaXR5KGFidW5kLCBncm91cD0ic2FtcGxlIiwgbWluX3E9MCwgbWF4X3E9NCwgc3RlcF9xPTAuMDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaT0wLjk1LCBuYm9vdD1uYm9vdCkKc2FtcGxlX21haW4gPC0gcGFzdGUwKCJTYW1wbGUgZGl2ZXJzaXR5IChOPSIsIHNhbXBsZV9kaXZAblsxXSwgIikiKQpzYW1wbGVfZGl2QGRpdmVyc2l0eSR0cmVhdG1lbnQgPC0gc2FwcGx5KHNhbXBsZV9kaXZAZGl2ZXJzaXR5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCnNhbXBsZV9kaXZAZGl2ZXJzaXR5JHRpbWVfcG9pbnQgPC0gc2FwcGx5KHNhbXBsZV9kaXZAZGl2ZXJzaXR5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCnNhbXBsZV9kaXZAZGl2ZXJzaXR5JHBhdGllbnQgPC0gc2FwcGx5KHNhbXBsZV9kaXZAZGl2ZXJzaXR5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCmBgYApgYGB7ciBjbG9uYWxfZGl2ZXJzaXR5MiwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9MTIsIGVjaG8gPSBGQUxTRX0KZGl2X3AgPC0gZ2dwbG90KHNhbXBsZV9kaXZAZGl2ZXJzaXR5LCBhZXMoeCA9IHEsIHkgPSBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzYW1wbGUpKSArCiAgICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGRfbG93ZXIsCiAgICAgICAgICAgICAgICAgICAgeW1heCA9IGRfdXBwZXIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9IHRpbWVfcG9pbnQpLCBhbHBoYSA9IDAuNCkgKwogICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHRpbWVfcG9pbnQpKSArCiAgICB4bGFiKCJxIikgKyB5bGFiKGV4cHJlc3Npb24oIiJecSAqIEQpKSArCiAgICBnZ3RpdGxlKHNhbXBsZV9tYWluKSArCiAgICBmYWNldF9ncmlkKGNvbHM9dmFycyhwYXRpZW50KSkKZGl2X3AKYGBgCmBgYHtyIGluY2x1ZGUgPSBGQUxTRX0KZ2dzYXZlKHBsb3Q9ZGl2X3AsIGZpbGVuYW1lPXBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3BhdGllbnRfZ3JpZC5wbmciKSwgZGV2aWNlPSJwbmciLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdD1kaXZfcCwgZmlsZW5hbWU9cGFzdGUwKGRpdmVyc2l0eV9kaXIsIi9EaXZlcnNpdHlfcGF0aWVudF9ncmlkLnBkZiIpLCBkZXZpY2U9InBkZiIsIHdpZHRoID0gMjUsIGhlaWdodCA9IDYsIHVuaXRzPSJjbSIpCmBgYAoKIyMjIENsb25hbCBkaXZlcnNpdHkgYXQgc3BlY2lmaWMgcSB2YWx1ZXMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgojIyMjIHE9MSB7LX0KCmBgYHtyIGNsb25hbF9kaXZlcnNpdHlfcTEsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTUsIGVjaG8gPSBGQUxTRX0Kc2FtcGxlX2RpdkBkaXZlcnNpdHkkdGltZV9wb2ludCA8LSBmYWN0b3Ioc2FtcGxlX2RpdkBkaXZlcnNpdHkkdGltZV9wb2ludCwgbGV2ZWxzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIikpCnNhbXBsZV9kaXZfcTEgPC0gc2FtcGxlX2RpdkBkaXZlcnNpdHlbd2hpY2goc2FtcGxlX2RpdkBkaXZlcnNpdHkkcSA9PSAxKSxdCnNhbXBsZV9tYWluIDwtIHBhc3RlMCgiU2FtcGxlIGRpdmVyc2l0eSBhdCBxPTEgKE49Iiwgc2FtcGxlX2RpdkBuWzFdLCAiKSIpCmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KQpkcTEgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcTEsIGFlcyh5PWQsIHg9dGltZV9wb2ludCkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yPXBhdGllbnQsZ3JvdXA9dGltZV9wb2ludCkscG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDMpICsKICAgICNnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWQtZF9zZCwgeW1heD1kK2Rfc2QpLCB3aWR0aCA9IC4wNSwgcG9zaXRpb249ZG9kZ2UpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXA9cGF0aWVudCxjb2xvcj1wYXRpZW50KSkgKwogICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MSkiKSArCiAgICBnZ3RpdGxlKHNhbXBsZV9tYWluKSArCiAgICBzY2FsZV9jb2xvdXJfYnJld2VyKHBhbGV0dGUgPSAiQWNjZW50IikrCiAgICAjZmFjZXRfZ3JpZChjb2xzPXZhcnMocGF0aWVudCksIGRyb3A9VCwgc3BhY2U9ImZyZWUiLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmRxMQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHExLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3Rfc3ViamVjdF9wYWlyZWQucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDUsIGhlaWdodCA9IDQsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90ID0gZHExLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3Rfc3ViamVjdF9wYWlyZWQucGRmIiksIGRldmljZT0icGRmIiwKICAgICAgICB3aWR0aCA9IDUsIGhlaWdodCA9IDQsIHVuaXRzPSJjbSIpCmBgYAoKIyMjIyBxPTAgey19CgpgYGB7ciBjbG9uYWxfZGl2ZXJzaXR5X3EwLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01LCBlY2hvID0gRkFMU0V9CnNhbXBsZV9kaXZfcTAgPC0gc2FtcGxlX2RpdkBkaXZlcnNpdHlbd2hpY2goc2FtcGxlX2RpdkBkaXZlcnNpdHkkcSA9PSAwKSxdCnNhbXBsZV9tYWluIDwtIHBhc3RlMCgiU2FtcGxlIGRpdmVyc2l0eSBhdCBxPTAgKE49Iiwgc2FtcGxlX2RpdkBuWzFdLCAiKSIpCmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KQpkcTAgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcTAsIGFlcyh5PWQsIHg9dGltZV9wb2ludCkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yPXBhdGllbnQsZ3JvdXA9dGltZV9wb2ludCkscG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDMpICsKICAgICNnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWQtZF9zZCwgeW1heD1kK2Rfc2QpLCB3aWR0aCA9IC4wNSwgcG9zaXRpb249ZG9kZ2UpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXA9cGF0aWVudCxjb2xvcj1wYXRpZW50KSkgKwogICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MCkiKSArCiAgICBnZ3RpdGxlKHNhbXBsZV9tYWluKSArCiAgICBzY2FsZV9jb2xvdXJfYnJld2VyKHBhbGV0dGUgPSAiQWNjZW50IikrCiAgICAjZmFjZXRfZ3JpZChjb2xzPXZhcnMocGF0aWVudCksIGRyb3A9VCwgc3BhY2U9ImZyZWUiLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmRxMApgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHEwLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3EwX3Rlc3Rfc3ViamVjdF9wYWlyZWQucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGRxMCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMF90ZXN0X3N1YmplY3RfcGFpcmVkLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyNSwgaGVpZ2h0ID0gNiwgdW5pdHM9ImNtIikKYGBgCgojIyBDbG9uYWwgZGl2ZXJzaXR5IHBlciBjZWxsIHBvcHVsYXRpb24KCmBgYHtyIGNsb25hbF9kaXZlcnNpdHlfcG9wLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnNhbXBsZV9kaXZfcG9wIDwtIGFscGhhRGl2ZXJzaXR5KGFidW5kX3BvcCwgZ3JvdXA9InNhbXBsZV9wb3AiLCBtaW5fcT0wLCBtYXhfcT00LCBzdGVwX3E9MC4wNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaT0wLjk1LCBuYm9vdD1uYm9vdCkKc2FtcGxlX21haW4gPC0gcGFzdGUwKCJTYW1wbGUgZGl2ZXJzaXR5IChOPSIsIHNhbXBsZV9kaXZfcG9wQG5bMV0sICIpIikKc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHRyZWF0bWVudCA8LSBzYXBwbHkoc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkdGltZV9wb2ludCA8LSBzYXBwbHkoc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkcGF0aWVudCA8LSBzYXBwbHkoc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQpzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkcG9wdWxhdGlvbiA8LSBzYXBwbHkoc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzRdKQpgYGAKCmBgYHtyIGNsb25hbF9kaXZlcnNpdHlfcG9wX3Bsb3QsIGZpZy53aWR0aD0xMiwgZWNobz1GLCBtZXNzYWdlPUZ9CnNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSR0aW1lX3BvaW50IDwtIGZhY3RvcihzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkdGltZV9wb2ludCwgbGV2ZWxzID0gYygiYmFzZWxpbmUiLCI2bW9udGhzIiwiMTJtb250aHMiKSkKc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHBvcHVsYXRpb24gPC0gZmFjdG9yKHNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSRwb3B1bGF0aW9uLCBsZXZlbHMgPSBjKCJOIiwgIk0iLCAiRE4iLCAiUCIpKQpzYW1wbGVfZGl2X3BvcF9kZiA8LSAgc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5CmRpdl9wb3AgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSwgYWVzKHggPSBxLCB5ID0gZCwgZ3JvdXAgPSBzYW1wbGVfcG9wKSkgKwogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBkX2xvd2VyLAogICAgICAgICAgICAgICAgICAgIHltYXggPSBkX3VwcGVyLCBmaWxsID0gdGltZV9wb2ludCksIGFscGhhID0gMC40KSArCiAgICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gdGltZV9wb2ludCkpICsKICAgIGxhYnMoY29sb3I9IlRpbWUgUG9pbnQiLCBmaWxsPSJUaW1lIFBvaW50IikgKwogICAgeGxhYigicSIpICsgeWxhYihleHByZXNzaW9uKCIiXnEgKiBEKSkgKwogICAgZ2d0aXRsZShzYW1wbGVfbWFpbikgKwogICAgZmFjZXRfZ3JpZChjb2xzPXZhcnMocGF0aWVudCksIHJvd3M9dmFycyhwb3B1bGF0aW9uKSwgc2NhbGVzPSJmcmVlIiwgZHJvcCA9IFQpCmRpdl9wb3AKYGBgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KZ2dzYXZlKHBsb3QgPSBkaXZfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3N1YmplY3RfcG9wdWxhdGlvbi5wbmciKSwgZGV2aWNlPSJwbmciLAogICAgICAgIHdpZHRoID0gMjcsIGhlaWdodCA9IDIwLCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGRpdl9wb3AsIGZpbGVuYW1lID0gcGFzdGUwKGRpdmVyc2l0eV9kaXIsIi9EaXZlcnNpdHlfc3ViamVjdF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyNywgaGVpZ2h0ID0gMjAsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90ID0gZGl2X3BvcCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9zdWJqZWN0X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDI3LCBoZWlnaHQgPSAyMCwgdW5pdHM9ImNtIikKYGBgCgojIyMgQ2xvbmFsIGRpdmVyc2l0eSBwZXIgcG9wdWxhdGlvbiBhdCBzcGVjaWZpYyBxIHZhbHVlcyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIyMgcT0xIHstfQoKYGBge3IgY2xvbmFsX2RpdmVyc2l0eV9xMV9wb3AsIGVjaG8gPSBGQUxTRX0Kc2FtcGxlX2Rpdl9xMSA8LSBzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHlbd2hpY2goc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHEgPT0gMSksXQpzYW1wbGVfbWFpbiA8LSBwYXN0ZTAoIlNhbXBsZSBkaXZlcnNpdHkgYXQgcT0xIChOPSIsIHNhbXBsZV9kaXZfcG9wQG5bMV0sICIpIikKZG9kZ2UgPC0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpCmRxMV9wb3AgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcTEsIGFlcyh5PWQsIHg9dGltZV9wb2ludCkpICsKICAgIGdlb21fcG9pbnQocG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDEpICsKICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW49ZC1kX3NkLCB5bWF4PWQrZF9zZCksIHdpZHRoID0gLjIsIHBvc2l0aW9uPWRvZGdlKSArCiAgICB4bGFiKCIiKSArIHlsYWIoIkRpdmVyc2l0eSAocT0xKSIpICsKICAgIGdndGl0bGUoc2FtcGxlX21haW4pICsKICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBhdGllbnQpLCByb3dzPXZhcnMocG9wdWxhdGlvbiksIGRyb3A9VCwgc2NhbGVzID0gImZyZWUiKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpkcTFfcG9wCmBgYAoKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHExX3BvcCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMV90ZXN0X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNSwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3QgPSBkcTFfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3RfcG9wdWxhdGlvbi5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE1LCB1bml0cz0iY20iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLGVjaG8gPSBGQUxTRX0Kc2FtcGxlX2Rpdl9xMSRzdWJqX3BvcCA8LSBwYXN0ZShzYW1wbGVfZGl2X3ExJHBhdGllbnQsIHNhbXBsZV9kaXZfcTEkcG9wdWxhdGlvbiwgc2VwID0gIl8iKQoKc2FtcGxlX2Rpdl9xMSA8LSBzYW1wbGVfZGl2X3ExWyEoc2FtcGxlX2Rpdl9xMSRzYW1wbGVfcG9wICVpbiUgYygiQ2xhZHJpYmluXzEybW9udGhzX0NMQUQ0X04iLCJDbGFkcmliaW5fNm1vbnRoc19DTEFENF9OIiwiQ2xhZHJpYmluX2Jhc2VsaW5lX0NMQUQ0X04iKSksXQoKIyAKIyBib3hwbG90X3BvcCA8LSBnZ3Bsb3Qoc2FtcGxlX2Rpdl9xMSwgYWVzKHk9ZCwgeD10aW1lX3BvaW50KSkgKwojICAgICBnZW9tX2JveHBsb3QoKSArCiMgICAgIGdlb21fcG9pbnQocG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDEpICsKIyAgICAgI2dlb21fZXJyb3JiYXIoYWVzKHltaW49ZC1kX3NkLCB5bWF4PWQrZF9zZCksIHdpZHRoID0gLjIsIHBvc2l0aW9uPWRvZGdlKSArCiMgICAgIHhsYWIoIiIpICsgeWxhYigiRGl2ZXJzaXR5IChxPTEpIikgKwojICAgICBnZ3RpdGxlKHNhbXBsZV9tYWluKSArCiMgICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBvcHVsYXRpb24pLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIikgKwojICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQojIGJveHBsb3RfcG9wCiMgCiMgZ2dzYXZlKHBsb3QgPSBib3hwbG90X3BvcCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMV90ZXN0X2JveHBsb3RfcG9wdWxhdGlvbi5wbmciKSwgZGV2aWNlPSJwbmciLAojICAgICAgICAgd2lkdGggPSAxNSwgaGVpZ2h0ID0gNiwgdW5pdHM9ImNtIikKIyBnZ3NhdmUocGxvdCA9IGJveHBsb3RfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3RfYm94cGxvdF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2U9InBkZiIsCiMgICAgICAgICB3aWR0aCA9IDE1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQoKIyBCb3hwbG90IHdpdGggV2lsY294b24gcGFpcmVkIHRlc3RzIChnZ3B1YnIpCm15X2NvbXBhcmlzb25zIDwtIGxpc3QoIGMoImJhc2VsaW5lIiwgIjZtb250aHMiKSwgYygiNm1vbnRocyIsICIxMm1vbnRocyIpLCBjKCJiYXNlbGluZSIsICIxMm1vbnRocyIpICkKCmJveHBsb3RfZGl2cTEgPC0gZ2dib3hwbG90KHNhbXBsZV9kaXZfcTEsIHggPSAidGltZV9wb2ludCIsIHkgPSAiZCIsCiAgICAgICAgYWRkID0gImppdHRlciIsIGxlZ2VuZCA9ICJub25lIiwKICAgICAgICAgY29sb3IgPSAidGltZV9wb2ludCIsIGxpbmUuY29sb3IgPSAiZ3JheSIsIGxpbmUuc2l6ZSA9IDAuNCwKICAgICAgICAgZmFjZXQuYnkgPSAicG9wdWxhdGlvbiIsIG5jb2wgPSA0LCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MSkiKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIHBhaXJlZCA9VCwgbWV0aG9kID0gIndpbGNveCIsIGxhYmVsPSJwLnNpZ25pZiIsIGhpZGUubnMgPSBUKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsPSJwLmZvcm1hdCIsIGxhYmVsLnkgPSAxMzAwKQoKYm94cGxvdF9kaXZxMQoKYm94cGxvdF9kaXZxMV9ub2tydXNrYWwgPC0gZ2dib3hwbG90KHNhbXBsZV9kaXZfcTEsIHggPSAidGltZV9wb2ludCIsIHkgPSAiZCIsCiAgICAgICAgYWRkID0gImppdHRlciIsIGxlZ2VuZCA9ICJub25lIiwKICAgICAgICAgY29sb3IgPSAidGltZV9wb2ludCIsIGxpbmUuY29sb3IgPSAiZ3JheSIsIGxpbmUuc2l6ZSA9IDAuNCwKICAgICAgICAgZmFjZXQuYnkgPSAicG9wdWxhdGlvbiIsIG5jb2wgPSA0LCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MSkiKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIHBhaXJlZCA9VCwgbWV0aG9kID0gIndpbGNveCIsIGxhYmVsPSJwLnNpZ25pZiIsIGhpZGUubnMgPSBUKQpib3hwbG90X2RpdnExX25va3J1c2thbApgYGAKCmBgYHtyLCBlY2hvPUZ9Cmdnc2F2ZShwbG90PWJveHBsb3RfZGl2cTEsIGZpbGVuYW1lID0gcGFzdGUwKGRpdmVyc2l0eV9kaXIsIi9EaXZlcnNpdHlfcTFfc3Vial9wb3BfYm94cGxvdHMucG5nIiksIGRldmljZT0icG5nIiwgCiAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSA3LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdD1ib3hwbG90X2RpdnExLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3N1YmpfcG9wX2JveHBsb3RzLnBkZiIpLCBkZXZpY2U9InBkZiIsIAogICAgICAgd2lkdGg9MjAsIGhlaWdodD03LCB1bml0cz0iY20iKQpgYGAKCiMjIyMgcT0wIHstfQoKYGBge3IgY2xvbmFsX2RpdmVyc2l0eV9xMF9wb3AsIGZpZy53aWR0aD0xMCwgZmlnLmFzcCA9IDAuNiwgZWNobyA9IEZBTFNFfQpzYW1wbGVfZGl2X3EwIDwtIHNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eVt3aGljaChzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkcSA9PSAwKSxdCgoKc2FtcGxlX21haW4gPC0gcGFzdGUwKCJTYW1wbGUgZGl2ZXJzaXR5IGF0IHE9MCAoTj0iLCBzYW1wbGVfZGl2X3BvcEBuWzFdLCAiKSIpCmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KQpkcTBfcG9wIDwtIGdncGxvdChzYW1wbGVfZGl2X3EwLCBhZXMoeT1kLCB4PXRpbWVfcG9pbnQpKSArCiAgICBnZW9tX3BvaW50KHBvc2l0aW9uPWRvZGdlLCBzdGF0PSJpZGVudGl0eSIsIHNpemUgPSAxKSArCiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWQtZF9zZCwgeW1heD1kK2Rfc2QpLCB3aWR0aCA9IC4yLCBwb3NpdGlvbj1kb2RnZSkgKwogICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MCkiKSArCiAgICBnZ3RpdGxlKHNhbXBsZV9tYWluKSArCiAgICBmYWNldF9ncmlkKGNvbHM9dmFycyhwYXRpZW50KSwgcm93cz12YXJzKHBvcHVsYXRpb24pLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIikgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKZHEwX3BvcApgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHEwX3BvcCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMF90ZXN0X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNSwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3QgPSBkcTBfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3EwX3Rlc3RfcG9wdWxhdGlvbi5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE1LCB1bml0cz0iY20iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLGVjaG8gPSBGQUxTRX0KIyBCb3hwbG90IHdpdGggV2lsY294b24gcGFpcmVkIHRlc3RzIChnZ3B1YnIpCnNhbXBsZV9kaXZfcTAgPC0gc2FtcGxlX2Rpdl9xMFshKHNhbXBsZV9kaXZfcTAkc2FtcGxlX3BvcCAlaW4lIGMoIkNsYWRyaWJpbl8xMm1vbnRoc19DTEFENF9OIiwiQ2xhZHJpYmluXzZtb250aHNfQ0xBRDRfTiIsIkNsYWRyaWJpbl9iYXNlbGluZV9DTEFENF9OIikpLF0KCm15X2NvbXBhcmlzb25zIDwtIGxpc3QoIGMoImJhc2VsaW5lIiwgIjZtb250aHMiKSwgYygiNm1vbnRocyIsICIxMm1vbnRocyIpLCBjKCJiYXNlbGluZSIsICIxMm1vbnRocyIpICkKCmJveHBsb3RfZGl2cTAgPC0gZ2dib3hwbG90KHNhbXBsZV9kaXZfcTAsIHggPSAidGltZV9wb2ludCIsIHkgPSAiZCIsCiAgICAgICAgYWRkID0gImppdHRlciIsIGxlZ2VuZCA9ICJub25lIiwKICAgICAgICAgY29sb3IgPSAidGltZV9wb2ludCIsIGxpbmUuY29sb3IgPSAiZ3JheSIsIGxpbmUuc2l6ZSA9IDAuNCwKICAgICAgICAgZmFjZXQuYnkgPSAicG9wdWxhdGlvbiIsIG5jb2wgPSA0LCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MCkiKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIHBhaXJlZCA9VCwgbWV0aG9kID0gIndpbGNveCIsIGxhYmVsPSJwLnNpZ25pZiIsIGhpZGUubnMgPSBUKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsPSJwLmZvcm1hdCIsIGxhYmVsLnk9MTMwMCkKYm94cGxvdF9kaXZxMAoKYm94cGxvdF9kaXZxMF9ub2tydXNrYWwgPC0gZ2dib3hwbG90KHNhbXBsZV9kaXZfcTAsIHggPSAidGltZV9wb2ludCIsIHkgPSAiZCIsCiAgICAgICAgYWRkID0gImppdHRlciIsIGxlZ2VuZCA9ICJub25lIiwKICAgICAgICAgY29sb3IgPSAidGltZV9wb2ludCIsIGxpbmUuY29sb3IgPSAiZ3JheSIsIGxpbmUuc2l6ZSA9IDAuNCwKICAgICAgICAgZmFjZXQuYnkgPSAicG9wdWxhdGlvbiIsIG5jb2wgPSA0LCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MCkiKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIHBhaXJlZCA9VCwgbWV0aG9kID0gIndpbGNveCIsIGxhYmVsPSJwLnNpZ25pZiIsIGhpZGUubnMgPSBUKQpib3hwbG90X2RpdnEwX25va3J1c2thbApgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gYm94cGxvdF9kaXZxMCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMF90ZXN0X3BvcHVsYXRpb25fYm94cGxvdC5wbmciKSwgZGV2aWNlPSJwbmciLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDcsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90ID0gYm94cGxvdF9kaXZxMCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMF90ZXN0X3BvcHVsYXRpb25fYm94cGxvdC5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDcsIHVuaXRzPSJjbSIpCmBgYAoKIyMgRmlndXJlIGRpdmVyc2l0eSBhbmQgYWJ1bmRhbmNlIG1ldHJpY3MKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmFzcD0xLGVjaG8gPSBGQUxTRX0KYWxsX2JveHBsb3RzIDwtIGNvd3Bsb3Q6OnBsb3RfZ3JpZChib3hwbG90X2RpdnEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBib3hwbG90X2RpdnExLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJveHBsb3RfY2xvbmVfc2l6ZSwKICAgICAgICAgIGxhYmVscz1jKCJBIiwiQiIsIkMiKSwKICAgICAgICAgIG5jb2w9MSwKICAgICAgICAgIGFsaWduID0gVAogICAgICAgICAgKQphbGxfYm94cGxvdHMKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTYsIGVjaG89RiwgaW5jbHVkZT1GfQpnZ3NhdmUocGxvdCA9IGFsbF9ib3hwbG90cywgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0ZpZ3VyZV9hbGxib3hwbG90cy5wbmciKSwgZGV2aWNlPSJwbmciLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE2LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGFsbF9ib3hwbG90cywgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0ZpZ3VyZV9hbGxib3hwbG90cy5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE2LCB1bml0cz0iY20iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmFzcD0wLjQsZWNobyA9IEZBTFNFfQphbGxfYm94cGxvdHNfc3VwcGwgPC0gcGxvdF9ncmlkKGJveHBsb3RfZ2luaSwKICAgICAgICAgIGxhYmVscz1jKCJBIiksCiAgICAgICAgICBuY29sPTEsCiAgICAgICAgICBhbGlnbiA9IFQKICAgICAgICAgICkKYWxsX2JveHBsb3RzX3N1cHBsCmBgYAoKYGBge3IsIGZpZy53aWR0aD02LCBlY2hvPUYsIGluY2x1ZGU9Rn0KZ2dzYXZlKHBsb3QgPSBhbGxfYm94cGxvdHNfc3VwcGwsIGZpbGVuYW1lID0gcGFzdGUwKGRpdmVyc2l0eV9kaXIsIi9GaWd1cmVfYWxsYm94cGxvdHNfc3VwcGwucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPTcsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90ID0gYWxsX2JveHBsb3RzX3N1cHBsLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRmlndXJlX2FsbGJveHBsb3RzX3N1cHBsLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNywgdW5pdHM9ImNtIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5hc3A9MSxlY2hvID0gRkFMU0V9CmFsbF9ib3hwbG90c19ub2tydXNrYWwgPC0gcGxvdF9ncmlkKCAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgIGJveHBsb3RfZGl2cTBfbm9rcnVza2FsLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJveHBsb3RfZGl2cTFfbm9rcnVza2FsLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJveHBsb3RfY2xvbmVfc2l6ZV9ub2tydXNrYWwsCiAgICAgICAgICBsYWJlbHM9YygiQSIsIkIiLCJDIiksCiAgICAgICAgICBuY29sPTEsCiAgICAgICAgICBhbGlnbiA9IFQKICAgICAgICAgICkKYWxsX2JveHBsb3RzX25va3J1c2thbApgYGAKCmBgYHtyLCBmaWcud2lkdGg9NiwgZWNobz1GLCBpbmNsdWRlPUZ9Cmdnc2F2ZShwbG90ID0gYWxsX2JveHBsb3RzX25va3J1c2thbCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0ZpZ3VyZV9hbGxib3hwbG90c19ub2tydXNrYWwucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNiwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3QgPSBhbGxfYm94cGxvdHNfbm9rcnVza2FsLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRmlndXJlX2FsbGJveHBsb3RzX25va3J1c2thbC5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE2LCB1bml0cz0iY20iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmFzcD0wLjQsZWNobyA9IEZBTFNFfQphbGxfYm94cGxvdHNfbm9rcnVza2FsX3N1cHBsIDwtIHBsb3RfZ3JpZChib3hwbG90X2dpbmlfbm9rcnVza2FsLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJBIiksCiAgICAgICAgICBuY29sPTEsCiAgICAgICAgICBhbGlnbiA9IFQKICAgICAgICAgICkKYWxsX2JveHBsb3RzX25va3J1c2thbF9zdXBwbApgYGAKCmBgYHtyLCBmaWcud2lkdGg9NiwgZWNobz1GLCBpbmNsdWRlPUZ9Cmdnc2F2ZShwbG90ID0gYWxsX2JveHBsb3RzX25va3J1c2thbF9zdXBwbCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0ZpZ3VyZV9hbGxib3hwbG90c19ub2tydXNrYWxfc3VwcGwucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSA3LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGFsbF9ib3hwbG90c19ub2tydXNrYWwsIGZpbGVuYW1lID0gcGFzdGUwKGRpdmVyc2l0eV9kaXIsIi9GaWd1cmVfYWxsYm94cGxvdHNfbm9rcnVza2FsX3N1cHBsLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNywgdW5pdHM9ImNtIikKYGBgCgojIFYgZ2VuZSB1c2FnZQoKIyMgViBnZW5lIGZhbWlseSB1c2FnZSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KClRoZSBWIGdlbmUgdXNhZ2UgKGluIHBlcmNlbnRhZ2UpIGluIGVhY2ggb2YgdGhlIHNhbXBsZXMgaXMgcmVwcmVzZW50ZWQgYmVsb3cuIEFsbCBwbG90cyBhbmQgdGFibGVzIGNhbiBiZSBmb3VuZCBbaGVyZV0oLi9yZXBlcnRvaXJlX2NvbXBhcmlzb24vVl9mYW1pbHkvKS4KCkdlbmUgZmFtaWx5IHVzYWdlIGlzIG5vcm1hbGl6ZWQgYnkgdGhlIG51bWJlciBvZiBjbG9uZXMuCgojIyMgQnkgcGF0aWVudCB7LX0KCmBgYHtyLCBlY2hvPUYsZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuMywgZmlnLmFsaWduPSdjZW50ZXInfQpmYW1pbHkgPC0gY291bnRHZW5lcyhkZl9hbGwsIGdlbmU9InZfY2FsbCIsIGdyb3Vwcz0ic2FtcGxlIiwgbW9kZT0iZmFtaWx5IiwgY2xvbmU9ImNsb25lX2lkIikKZmFtaWx5JHRyZWF0bWVudCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCmZhbWlseSR0aW1lX3BvaW50IDwtIHNhcHBseShmYW1pbHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsyXSkKZmFtaWx5JHRpbWVfcG9pbnQgPC0gZmFjdG9yKGZhbWlseSR0aW1lX3BvaW50LCBsZXZlbHM9YygiYmFzZWxpbmUiLCI2bW9udGhzIiwiMTJtb250aHMiKSkKZmFtaWx5JHBhdGllbnQgPC0gc2FwcGx5KGZhbWlseSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQoKCmdnMSA8LSBnZ3Bsb3QoZmFtaWx5LCBhZXMoZmlsbD1nZW5lLCB5PWNsb25lX2ZyZXEsIHg9dGltZV9wb2ludCkpICsKICAgICAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIHN0YXQ9ImlkZW50aXR5IikgKwogICAgICAgIGZhY2V0X2dyaWQoY29scyA9IHZhcnMocGF0aWVudCksIGRyb3A9VCwgc2NhbGVzID0gImZyZWUiICkgKwogICAgICAgICAgICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEsIHZqdXN0PTEpKQoKCiMgZzIgPC0gZ2dwbG90KGZhbWlseSwgYWVzKHg9dGltZV9wb2ludCwgeT1jbG9uZV9mcmVxLCBmaWxsPXRpbWVfcG9pbnQpKSArCiMgICAgIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiMgICAgIGdndGl0bGUoIlYgR2VuZSBGYW1pbHkgVXNhZ2UiKSArCiMgICAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsKIyAgICAgeWxhYigiRnJlcXVlbmN5IikgKwojICAgICB4bGFiKCIiKSArCiMgICAgIGZhY2V0X2dyaWQoY29scyA9IHZhcnMocGF0aWVudCksIHJvd3M9dmFycyhnZW5lKSxkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIiApICsKIyAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiMgICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkJsdWVzIikKZ2cxCiNnMgpgYGAKCmBgYHtyLCBlY2hvPUZ9Cmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX0ZhbWlseV9kaXN0cmlidXRpb25fcGF0aWVudC5zdmciKSwgcGxvdCA9IGdnMSwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNiwgdW5pdHMgPSAiY20iKQpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAodmZhbWlseV9kaXIsICIvVl9GYW1pbHlfZGlzdHJpYnV0aW9uX3BhdGllbnQucG5nIiksIHBsb3QgPSBnZzEsIHdpZHRoID0gMjAsIGhlaWdodCA9IDYsIHVuaXRzID0gImNtIikKd3JpdGUudGFibGUoZmFtaWx5LCBmaWxlID0gcGFzdGUwKHZmYW1pbHlfZGlyLCAiL1ZfZmFtaWx5X2Rpc3RyaWJ1dGlvbl9kYXRhLnRzdiIpLCBzZXAgPSAiXHQiLCBxdW90ZSA9IEYsIHJvdy5uYW1lcyA9IEYpCmBgYAoKYGBge3IsIGVjaG89RixmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLCBmaWcuYWxpZ249J2NlbnRlcid9CiMgZG9kZ2UgPC0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpCiMgZzMgPC0gZ2dwbG90KGZhbWlseSwgYWVzKHg9dGltZV9wb2ludCwgeT1jbG9uZV9mcmVxKSkgKwojICAgICBnZW9tX3BvaW50KHBvc2l0aW9uID1kb2RnZSwgc3RhdD0iaWRlbnRpdHkiLCBzaXplPTEpICsKIyAgICAgZ2VvbV9ib3hwbG90KCkgKwojICAgICAjZ2VvbV9saW5lKGFlcyhncm91cD1wYXRpZW50LGNvbG9yPXBhdGllbnQpKSArCiMgICAgIGdndGl0bGUoIlYgR2VuZSBGYW1pbHkgVXNhZ2UiKSArCiMgICAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsKIyAgICAgeWxhYigiRnJlcXVlbmN5IikgKwojICAgICB4bGFiKCIiKSArCiMgICAgIGZhY2V0X2dyaWQoY29scz12YXJzKGdlbmUpLGRyb3A9VCwgc2NhbGVzID0gImZyZWUiICkgCiMgICAgICN0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKIyAgICAgI3NjYWxlX2NvbG91cl9icmV3ZXIocGFsZXR0ZT0iQWNjZW50IikKIyBnMwoKCnZnZW5lX2JveHBsb3QgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoZmFtaWx5LCB4PSJ0aW1lX3BvaW50IiwgeT0iY2xvbmVfZnJlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCBsZWdlbmQ9Im5vbmUiLCBjb2xvciA9ICJ0aW1lX3BvaW50IiwgbGluZS5jb2xvciA9ICJncmF5IiwgbGluZS5zaXplID0gMC40LAogICAgICAgICAgICAgICAgICAgICAgICBmYWNldC5ieSA9ICJnZW5lIiwgbnJvdyA9IDEsIHNob3J0LnBhbmVsLmxhYnMgPSBUKSArCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICAgICAgICAgICAgICAgeGxhYigiIikgKyB5bGFiKCJGcmVxdWVuY3kiKSArCiAgICAgICAgICAgICAgICAgICAgICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgcGFpcmVkPVQsIG1ldGhvZCA9ICJ3aWxjb3giLCBsYWJlbD0icC5zaWduaWYiKSArCiAgICAgICAgICAgICAgICAgICAgICBzdGF0X2NvbXBhcmVfbWVhbnMocGFpcmVkPVQsIGxhYmVsPSJwLmZvcm1hdCIsIGxhYmVsLnkgPSAwLjkpCnZnZW5lX2JveHBsb3QKCmBgYAoKYGBge3IsIGVjaG89Rn0KZ2dzYXZlKHBsb3QgPSB2Z2VuZV9ib3hwbG90LCBmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwiL1ZfRmFtaWx5X2Rpc3RyaWJ1dGlvbl9wYXRpZW50X2JveHBsb3QucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSA3LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IHZnZW5lX2JveHBsb3QsIGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCIvVl9GYW1pbHlfZGlzdHJpYnV0aW9uX3BhdGllbnRfYm94cGxvdC5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDcsIHVuaXRzPSJjbSIpCmBgYAoKIyMjIEJ5IFBvcHVsYXRpb24gey19CgpgYGB7ciwgZWNobz1GLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC44LCBmaWcuYWxpZ249J2NlbnRlcid9CmZhbWlseV9wb3AgPC0gY291bnRHZW5lcyhkZl9hbGwsIGdlbmU9InZfY2FsbCIsIGdyb3Vwcz0ic2FtcGxlX3BvcCIsCiAgICAgICAgICAgICAgICAgICAgbW9kZT0iZmFtaWx5IiwgY2xvbmUgPSAiY2xvbmVfaWQiKQpmYW1pbHlfcG9wJHRyZWF0bWVudCA8LSBzYXBwbHkoZmFtaWx5X3BvcCRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsxXSkKZmFtaWx5X3BvcCR0aW1lX3BvaW50IDwtIHNhcHBseShmYW1pbHlfcG9wJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpmYW1pbHlfcG9wJHBhdGllbnQgPC0gc2FwcGx5KGZhbWlseV9wb3Akc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCmZhbWlseV9wb3AkcG9wdWxhdGlvbiA8LSBzYXBwbHkoZmFtaWx5X3BvcCRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVs0XSkKZmFtaWx5X3BvcCR0aW1lX3BvaW50IDwtIGZhY3RvcihmYW1pbHlfcG9wJHRpbWVfcG9pbnQsIGxldmVscz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpKQpmYW1pbHlfcG9wJHBvcHVsYXRpb24gPC0gZmFjdG9yKGZhbWlseV9wb3AkcG9wdWxhdGlvbiwgbGV2ZWxzPWMoIk4iLCJNIiwiRE4iLCJQIikpCgoKZ2cxIDwtIGdncGxvdChmYW1pbHlfcG9wLCBhZXMoZmlsbD1nZW5lLCB5PWNsb25lX2ZyZXEsIHg9dGltZV9wb2ludCkpICsKICAgICAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIHN0YXQ9ImlkZW50aXR5IikgKwogICAgICAgIGZhY2V0X2dyaWQoY29scyA9IHZhcnMocGF0aWVudCksIHJvd3MgPSB2YXJzKHBvcHVsYXRpb24pLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIiApICsKICAgICAgICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkIiLCAiNk0iLCAiMTJNIikpICsKICAgICAgICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1ZW5jeSIpCgpnZzEKCmBgYAoKYGBge3IsIGVjaG8gPSBGfQpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAodmZhbWlseV9kaXIsIi9WX0ZhbWlseV9kaXN0cmlidXRpb25fcGF0aWVudF9wb3B1bGF0aW9uLnN2ZyIpLCBwbG90ID0gZ2cxLAogICAgd2lkdGggPSAyMCwgaGVpZ2h0ID0gMTYsIHVuaXRzID0gImNtIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCIvVl9GYW1pbHlfZGlzdHJpYnV0aW9uX3BhdGllbnRfcG9wdWxhdGlvbi5wbmciKSwgcGxvdCA9IGdnMSwKICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE2LCB1bml0cyA9ICJjbSIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwiL1ZfRmFtaWx5X2Rpc3RyaWJ1dGlvbl9wYXRpZW50X3BvcHVsYXRpb24ucGRmIiksIHBsb3QgPSBnZzEsCiAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNiwgdW5pdHMgPSAiY20iKQp3cml0ZS50YWJsZShmYW1pbHksIGZpbGUgPSBwYXN0ZTAodmZhbWlseV9kaXIsICIvVl9mYW1pbHlfZGlzdHJpYnV0aW9uX2RhdGFfcG9wdWxhdGlvbi50c3YiKSwgc2VwID0gIlx0IiwKICAgIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKYGBgCgpgYGB7ciwgZWNobz1GLGZpZy53aWR0aD0xMCwgZmlnLmFzcD0xLCBmaWcuYWxpZ249J2NlbnRlcid9CiNmYW1pbHlfcG9wX20gPC0gZmFtaWx5X3BvcFsoZmFtaWx5X3BvcCRwb3B1bGF0aW9uPT0iTSIpLF0KCmZhbWlseV9wb3AgPC0gZmFtaWx5X3BvcFshKGZhbWlseV9wb3Akc2FtcGxlX3BvcCAlaW4lIGMoIkNsYWRyaWJpbl8xMm1vbnRoc19DTEFENF9OIiwiQ2xhZHJpYmluXzZtb250aHNfQ0xBRDRfTiIsIkNsYWRyaWJpbl9iYXNlbGluZV9DTEFENF9OIikpLF0KCiMgZG9kZ2UgPC0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpCiMgZzMgPC0gZ2dwbG90KGZhbWlseV9wb3AsIGFlcyh4PXRpbWVfcG9pbnQsIHk9Y2xvbmVfZnJlcSkpICsKIyAgICAgICBnZW9tX2JveHBsb3QoKSArCiMgICAgIGdlb21fcG9pbnQocG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZT0xKSArCiMgCiMgICAgICNnZW9tX2xpbmUoYWVzKGdyb3VwPXBhdGllbnQsY29sb3I9cGF0aWVudCkpICsKIyAgICAgZ2d0aXRsZSgiViBHZW5lIEZhbWlseSBVc2FnZSIpICsKIyAgICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0xKSkgKwojICAgICB5bGFiKCJGcmVxdWVuY3kiKSArCiMgICAgIHhsYWIoIiIpICsKIyAgICAgZmFjZXRfZ3JpZChjb2xzPXZhcnMoZ2VuZSksIHJvd3M9dmFycyhwb3B1bGF0aW9uKSwgZHJvcD1ULCBzY2FsZXMgPSAiZnJlZSIgKSAKIyAgICAgI3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwojICAgICAjc2NhbGVfY29sb3VyX2JyZXdlcihwYWxldHRlPSJBY2NlbnQiKQojIGczCgpteV9jb21wYXJpc29ucyA8LSBsaXN0KCBjKCJiYXNlbGluZSIsICI2bW9udGhzIiksIGMoIjZtb250aHMiLCAiMTJtb250aHMiKSwgYygiYmFzZWxpbmUiLCAiMTJtb250aHMiKSApCgojIFJlbW92ZSBJR0hWNyBhcyBubyBwcmltZXJzIHdlcmUgaW5jbHVkZWQgZm9yIHRoaXMgZ2VuZToKZmFtaWx5X3BvcCA8LSBmYW1pbHlfcG9wICU+JSBmaWx0ZXIoZ2VuZSAhPSAiSUdIVjciKQoKdmdlbmVfYm94cGxvdF9wb3AgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoZmFtaWx5X3BvcCwgeD0idGltZV9wb2ludCIsIHk9ImNsb25lX2ZyZXEiLAogICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIiwgbGVnZW5kPSJub25lIiwgY29sb3IgPSAidGltZV9wb2ludCIsIGxpbmUuY29sb3IgPSAiZ3JheSIsIGxpbmUuc2l6ZSA9IDAuNCwKICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXQuYnkgPSBjKCJwb3B1bGF0aW9uIiwiZ2VuZSIpLCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkIiLCAiNk0iLCAiMTJNIikpICsKICAgICAgICAgICAgICAgICAgICAgIHhsYWIoIiIpICsgeWxhYigiRnJlcXVlbmN5IikgKwogICAgICAgICAgICAgICAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIHBhaXJlZD1ULCBtZXRob2QgPSAid2lsY294IiwgbGFiZWw9InAuc2lnbmlmIiwgaGlkZS5ucyA9IFQpICsKICAgICAgICAgICAgICAgICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhwYWlyZWQ9VCwgbGFiZWw9InAuZm9ybWF0IiwgbGFiZWwueSA9IDEuMSwgaGlkZS5ucyA9IFQpCnZnZW5lX2JveHBsb3RfcG9wCgpgYGAKCmBgYHtyLCBlY2hvPUZ9Cmdnc2F2ZShwbG90ID0gdmdlbmVfYm94cGxvdF9wb3AsIGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCIvVl9nZW5lX2ZhbWlseV91c2FnZV9ib3hwbG90X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPTIwLCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IHZnZW5lX2JveHBsb3RfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwiL1ZfZ2VuZV9mYW1pbHlfdXNhZ2VfYm94cGxvdF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyMCwgaGVpZ2h0ID0yMCwgdW5pdHM9ImNtIikKCmBgYAoKIyMgViBnZW5lIHVzYWdlIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKVGhlIFYgZ2VuZSB1c2FnZSAoaW4gcGVyY2VudGFnZSkgaW4gZWFjaCBvZiB0aGUgc2FtcGxlcyBpcyByZXByZXNlbnRlZCBiZWxvdy4KQWxsIHBsb3RzIGFuZCB0YWJsZXMgY2FuIGJlIGZvdW5kIFtoZXJlXSguL3JlcGVydG9pcmVfY29tcGFyaXNvbi9WX2ZhbWlseS8pLgoKIyMjIEJ5IGNsb25lcyB7LX0KCmBgYHtyLCBlY2hvPUYsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0xLjgsIGZpZy5hbGlnbj0nY2VudGVyJ30KZmFtaWx5IDwtIGNvdW50R2VuZXMoZGZfYWxsLCBnZW5lPSJ2X2NhbGwiLCBncm91cHM9InNhbXBsZSIsIG1vZGU9ImdlbmUiLCBjbG9uZSA9ICJjbG9uZV9pZCIpCmZhbWlseSR0cmVhdG1lbnQgPC0gc2FwcGx5KGZhbWlseSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpmYW1pbHkkdGltZV9wb2ludCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCmZhbWlseSRwYXRpZW50IDwtIHNhcHBseShmYW1pbHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVszXSkKZzIgPC0gZ2dwbG90KGZhbWlseSwgYWVzKHg9Z2VuZSwgeT1jbG9uZV9mcmVxLCBmaWxsPWdlbmUpKSArCiAgICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpICsKICAgIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgICBnZ3RpdGxlKCJWIEdlbmUgRmFtaWx5IFVzYWdlIikgKwogICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0xKSkgKwogICAgeWxhYigiRnJlcXVlbmN5IikgKwogICAgeGxhYigiIikgKwogICAgZmFjZXRfd3JhcCh2YXJzKHBhdGllbnQpLCBzY2FsZXM9ImZyZWVfeCIsIG5jb2wgPSAxKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmcyCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX2dlbmVfZGlzdHJpYnV0aW9uX2J5X2Nsb25lX3BhdGllbnQuc3ZnIiksIHBsb3QgPSBnMiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNDAsIHVuaXRzID0gImNtIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCAiL1ZfZ2VuZV9kaXN0cmlidXRpb25fYnlfY2xvbmVfcGF0aWVudC5wbmciKSwgcGxvdCA9IGcyLCB3aWR0aCA9IDIwLCBoZWlnaHQgPSA0MCwgdW5pdHMgPSAiY20iKQp3cml0ZS50YWJsZShmYW1pbHksIGZpbGUgPSBwYXN0ZTAodmZhbWlseV9kaXIsICIvVl9nZW5lX2Rpc3RyaWJ1dGlvbl9ieV9jbG9uZV9kYXRhLnRzdiIpLCBzZXAgPSAiXHQiLCBxdW90ZSA9IEYsIHJvdy5uYW1lcyA9IEYpCmBgYAoKIyMjIEJ5IHNlcXVlbmNlcyB7LX0KCmBgYHtyLCBlY2hvPUYsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0xLjgsIGZpZy5hbGlnbj0nY2VudGVyJ30KZmFtaWx5IDwtIGNvdW50R2VuZXMoZGZfYWxsLCBnZW5lPSJ2X2NhbGwiLCBncm91cHM9InNhbXBsZSIsIG1vZGU9ImdlbmUiKQpmYW1pbHkkdHJlYXRtZW50IDwtIHNhcHBseShmYW1pbHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsxXSkKZmFtaWx5JHRpbWVfcG9pbnQgPC0gc2FwcGx5KGZhbWlseSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpmYW1pbHkkcGF0aWVudCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCmcyIDwtIGdncGxvdChmYW1pbHksIGFlcyh4PWdlbmUsIHk9c2VxX2ZyZXEsIGZpbGw9Z2VuZSkpICsKICAgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKwogICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICAgIGdndGl0bGUoIlYgR2VuZSBVc2FnZSIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsKICAgIHlsYWIoIkZyZXF1ZW5jeSIpICsKICAgIHhsYWIoIiIpICsKICAgIGZhY2V0X3dyYXAodmFycyhwYXRpZW50KSwgc2NhbGVzPSJmcmVlX3giLCBuY29sID0gMSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpnMgpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAodmZhbWlseV9kaXIsICIvVl9nZW5lX2Rpc3RyaWJ1dGlvbl9ieV9zZXF1ZW5jZV9wYXRpZW50LnN2ZyIpLCBwbG90ID0gZzIsIHdpZHRoID0gMjAsIGhlaWdodCA9IDQwLCB1bml0cyA9ICJjbSIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX2dlbmVfZGlzdHJpYnV0aW9uX2J5X3NlcXVlbmNlX3BhdGllbnQucG5nIiksIHBsb3QgPSBnMiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNDAsIHVuaXRzID0gImNtIikKd3JpdGUudGFibGUoZmFtaWx5LCBmaWxlID0gcGFzdGUwKHZmYW1pbHlfZGlyLCAiL1ZfZ2VuZV9kaXN0cmlidXRpb25fYnlfc2VxdWVuY2VfZGF0YS50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQpgYGAKCiMgSXNvdHlwZSB1c2FnZQoKIyMgSXNvdHlwZSB1c2FnZSBwZXIgc3ViamVjdAoKYGBge3IgaXNvdHlwZV91c2FnZSwgZWNobz1GLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLCBmaWcuYWxpZ249J2NlbnRlcid9CiMgUGxvdHRpbmcgSXNvdHlwZSBwZXJjZW50YWdlcyBwZXIgcGF0aWVudApkZl9hbGwkaXNvdHlwZSA8LSBkZl9hbGwkY19wcmltZXIKCnJlcyA8LSBkZl9hbGwgJT4lIGdyb3VwX2J5KGlzb3R5cGUsc2FtcGxlLHNvdXJjZSx0cmVhdG1lbnQsZXh0cmFjdF90aW1lKSAlPiUgZHBseXI6OnN1bW1hcmlzZShTZXFzX2lzb3R5cGU9bigpKQpyZXMgPC0gd2l0aChyZXMsIHJlc1tvcmRlcihzb3VyY2UpLF0pCnJlc19zYW1wbGUgPC0gZGZfYWxsICU+JSBncm91cF9ieShzYW1wbGUpICU+JSBkcGx5cjo6c3VtbWFyaXNlKFNlcXNfdG90YWw9bigpKQoKZnJlcXMgPC0gbWVyZ2UoeD1yZXMsIHk9cmVzX3NhbXBsZSwgYWxsLnggPSBULCBieS54ID0gInNhbXBsZSIsIGJ5LnkgPSAic2FtcGxlIikKZnJlcXMkRnJlcSA8LSAoZnJlcXMkU2Vxc19pc290eXBlL2ZyZXFzJFNlcXNfdG90YWwpCmZyZXFzJGV4dHJhY3RfdGltZSA8LSBmYWN0b3IoZnJlcXMkZXh0cmFjdF90aW1lLCBsZXZlbHM9YygiYmFzZWxpbmUiLCI2bW9udGhzIiwiMTJtb250aHMiKSkKCiMgZzQgPC0gZ2dwbG90KGZyZXFzLCBhZXMoZmlsbD1leHRyYWN0X3RpbWUsIHk9RnJlcSwgeD1pc290eXBlKSkgKwojICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKIyAgIHhsYWIoIiIpICsKIyAgIHlsYWIoIkZyZXF1ZW5jeSIpICsKIyAgIGdndGl0bGUoIklzb3R5cGUgZnJlcXVlbmN5IikgKwojICAgZmFjZXRfZ3JpZChjb2xzPXZhcnMoc291cmNlKSwgc2NhbGVzID0gImZyZWUiLCBkcm9wID0gVCkgKwojICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKIyBnNAoKZzQgPC0gZ2dwbG90KGZyZXFzLCBhZXMoZmlsbD1pc290eXBlLCB5PUZyZXEsIHg9ZXh0cmFjdF90aW1lKSkgKwogICAgICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgICAgICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhzb3VyY2UpLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIiApICsKICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0xKSkKZzQKYGBgCgpgYGB7ciwgZWNobz1GfQpnZ3NhdmUocGxvdD1nNCwgZmlsZW5hbWUgPSBwYXN0ZTAoaXNvdHlwZV9kaXIsIi9Jc290eXBlX2ZyZXF1ZW5jaWVzX3BhdGllbnQuc3ZnIiksIGRldmljZSA9ICJzdmciLAogIHdpZHRoID0gMjAsIGhlaWdodCA9IDYsIHVuaXRzID0gImNtIikKZ2dzYXZlKHBsb3Q9ZzQsIGZpbGVuYW1lID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV9mcmVxdWVuY2llc19wYXRpZW50LnBkZiIpLCBkZXZpY2UgPSAicGRmIiwKICB3aWR0aCA9IDIwLCBoZWlnaHQgPSA2LCB1bml0cyA9ICJjbSIpCndyaXRlLnRhYmxlKGZyZXFzLCBmaWxlID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV9mcmVxdWVuY2llc19kYXRhLnRzdiIpLCBzZXA9Ilx0IiwgcXVvdGU9Riwgcm93Lm5hbWVzID0gRikKCmBgYAoKIyMgSXNvdHlwZSB1c2FnZSBwZXIgY2VsbCBwb3B1bGF0aW9uCgpgYGB7ciBpc290eXBlX3BvcCwgZWNobz1GLCBmaWcud2lkdGg9MTUsIGZpZy5hc3A9MC42LCBmaWcuYWxpZ249J2NlbnRlcid9CmRmX2FsbCRpc290eXBlIDwtIGRmX2FsbCRjX3ByaW1lcgpyZXNfcG9wIDwtIGRmX2FsbCAlPiUgZ3JvdXBfYnkoaXNvdHlwZSwgc2FtcGxlX3BvcCwgc291cmNlLCB0cmVhdG1lbnQsIGV4dHJhY3RfdGltZSwgcG9wdWxhdGlvbikgJT4lIGRwbHlyOjpzdW1tYXJpc2UoU2Vxc19pc290eXBlPW4oKSkKcmVzX3BvcCA8LSB3aXRoKHJlc19wb3AsIHJlc19wb3Bbb3JkZXIoc291cmNlKSxdKQpyZXNfcG9wX3NhbXBsZSA8LSBkZl9hbGwgJT4lIGdyb3VwX2J5KHNhbXBsZV9wb3ApICU+JSBkcGx5cjo6c3VtbWFyaXNlKFNlcXNfdG90YWw9bigpKQoKZnJlcXMgPC0gbWVyZ2UoeD1yZXNfcG9wLCB5PXJlc19wb3Bfc2FtcGxlLCBhbGwueCA9IFQsIGJ5LnggPSAic2FtcGxlX3BvcCIsIGJ5LnkgPSAic2FtcGxlX3BvcCIpCmZyZXFzJEZyZXEgPC0gKGZyZXFzJFNlcXNfaXNvdHlwZS9mcmVxcyRTZXFzX3RvdGFsKQpmcmVxcyRleHRyYWN0X3RpbWUgPC0gZmFjdG9yKGZyZXFzJGV4dHJhY3RfdGltZSwgbGV2ZWxzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIikpCmZyZXFzJHBvcHVsYXRpb24gPC0gZmFjdG9yKGZyZXFzJHBvcHVsYXRpb24sIGxldmVscz1jKCJOIiwgIk0iLCAiRE4iLCAiUCIpKQojIGc0IDwtIGdncGxvdChmcmVxcywgYWVzKGZpbGw9ZXh0cmFjdF90aW1lLCB5PUZyZXEsIHg9aXNvdHlwZSkpICsKIyAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKIyAgeGxhYigiIikgKwojICB5bGFiKCJGcmVxdWVuY3kiKSArCiMgIGdndGl0bGUoIklzb3R5cGUgZnJlcXVlbmN5IikgKwojICBmYWNldF9ncmlkKGNvbHM9dmFycyhzb3VyY2UpLCByb3dzPXZhcnMocG9wdWxhdGlvbikpICsKIyAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKIyBnNAoKZzQgPC0gZ2dwbG90KGZyZXFzLCBhZXMoZmlsbD1pc290eXBlLCB5PUZyZXEsIHg9ZXh0cmFjdF90aW1lKSkgKwogICAgICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgICAgICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhzb3VyY2UpLCByb3dzPXZhcnMocG9wdWxhdGlvbiksZHJvcD1ULCBzY2FsZXMgPSAiZnJlZSIgKSArCiAgICAgICAgICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkIiLCAiNk0iLCAiMTJNIikpCmc0CmBgYAoKYGBge3IsIGVjaG89Rn0KZ2dzYXZlKGc0LCBmaWxlbmFtZSA9IHBhc3RlMChpc290eXBlX2RpciwiL0lzb3R5cGVfcGVyY2VudGFnZXNfY2VsbF9wb3B1bGF0aW9uLnN2ZyIpLCBkZXZpY2UgPSAic3ZnIiwKICB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNCwgdW5pdHMgPSAiY20iKQpnZ3NhdmUoZzQsIGZpbGVuYW1lID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV9wZXJjZW50YWdlc19jZWxsX3BvcHVsYXRpb24ucGRmIiksIGRldmljZSA9ICJwZGYiLAogIHdpZHRoID0gMjAsIGhlaWdodCA9IDE0LCB1bml0cyA9ICJjbSIpCmdnc2F2ZShnNCwgZmlsZW5hbWUgPSBwYXN0ZTAoaXNvdHlwZV9kaXIsIi9Jc290eXBlX3BlcmNlbnRhZ2VzX2NlbGxfcG9wdWxhdGlvbi5wbmciKSwgZGV2aWNlID0gInBuZyIsCiAgd2lkdGggPSAyMCwgaGVpZ2h0ID0gMTQsIHVuaXRzID0gImNtIikKCndyaXRlLnRhYmxlKGZyZXFzLCBmaWxlID0gcGFzdGUwKGlzb3R5cGVfZGlyLCAiL0lzb3R5cGVfZnJlcXVlbmNpZXNfY2VsbF9wb3B1bGF0aW9uX2RhdGEudHN2IiksIHNlcD0iXHQiLCBxdW90ZSA9IEYsIHJvdy5uYW1lcyA9IEYpCmBgYAoKYGBge3IsIGVjaG89RiwgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTF9Cm15X2NvbXBhcmlzb25zIDwtIGxpc3QoIGMoImJhc2VsaW5lIiwgIjZtb250aHMiKSwgYygiNm1vbnRocyIsICIxMm1vbnRocyIpLCBjKCJiYXNlbGluZSIsICIxMm1vbnRocyIpICkKCmZyZXFzIDwtIGZyZXFzWyEoZnJlcXMkc2FtcGxlX3BvcCAlaW4lIGMoIkNsYWRyaWJpbl8xMm1vbnRoc19DTEFENF9OIiwiQ2xhZHJpYmluXzZtb250aHNfQ0xBRDRfTiIsIkNsYWRyaWJpbl9iYXNlbGluZV9DTEFENF9OIikpLF0KCmlzb3R5cGVfYm94cGxvdF9wb3AgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoZnJlcXMsIHg9ImV4dHJhY3RfdGltZSIsIHk9IkZyZXEiLAogICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIiwgbGVnZW5kPSJub25lIiwgY29sb3IgPSAiZXh0cmFjdF90aW1lIiwgbGluZS5jb2xvciA9ICJncmF5IiwgbGluZS5zaXplID0gMC40LAogICAgICAgICAgICAgICAgICAgICAgICBmYWNldC5ieSA9IGMoInBvcHVsYXRpb24iLCJpc290eXBlIiksIHNob3J0LnBhbmVsLmxhYnMgPSBUKSArCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICAgICAgICAgICAgICAgeGxhYigiIikgKyB5bGFiKCJGcmVxdWVuY3kiKSArCiAgICAgICAgICAgICAgICAgICAgICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgcGFpcmVkPVQsIG1ldGhvZCA9ICJ3aWxjb3giLCBsYWJlbD0icC5zaWduaWYiLCBoaWRlLm5zPVQpICsKICAgICAgICAgICAgICAgICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhwYWlyZWQ9VCwgbGFiZWw9InAuZm9ybWF0IiwgbGFiZWwueSA9IDEuNCwgaGlkZS5ucyA9IFQpCmlzb3R5cGVfYm94cGxvdF9wb3AKYGBgCgpgYGB7ciwgZWNobz1GfQpnZ3NhdmUocGxvdCA9IGlzb3R5cGVfYm94cGxvdF9wb3AsIGZpbGVuYW1lID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV91c2FnZV9ib3hwbG90X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPTIwLCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGlzb3R5cGVfYm94cGxvdF9wb3AsIGZpbGVuYW1lID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV91c2FnZV9ib3hwbG90X3BvcHVsYXRpb24ucGRmIiksIGRldmljZT0icGRmIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPTIwLCB1bml0cz0iY20iKQoKYGBgCgpgYGB7ciwgZWNobz1GLGZpZy53aWR0aD0xMCwgZmlnLmFzcD0wLjMsIGZpZy5hbGlnbj0nY2VudGVyJ30KaXNvdHlwZV9wb3BfbSA8LSBmcmVxc1soZnJlcXMkcG9wdWxhdGlvbj09Ik0iKSxdCgppc290eXBlX2JveHBsb3RfcG9wX20gPC0gZ2dwdWJyOjpnZ2JveHBsb3QoaXNvdHlwZV9wb3BfbSwgeD0iZXh0cmFjdF90aW1lIiwgeT0iRnJlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCBsZWdlbmQ9Im5vbmUiLCBjb2xvciA9ICJleHRyYWN0X3RpbWUiLCBsaW5lLmNvbG9yID0gImdyYXkiLCBsaW5lLnNpemUgPSAwLjQsCiAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0LmJ5ID0gYygicG9wdWxhdGlvbiIsImlzb3R5cGUiKSwgc2hvcnQucGFuZWwubGFicyA9IFQpICsKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3M9YygiYmFzZWxpbmUiLCI2bW9udGhzIiwiMTJtb250aHMiKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJCIiwgIjZNIiwgIjEyTSIpKSArCiAgICAgICAgICAgICAgICAgICAgICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1ZW5jeSIpICsKICAgICAgICAgICAgICAgICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBwYWlyZWQ9VCwgbWV0aG9kID0gIndpbGNveCIsIGxhYmVsPSJwLnNpZ25pZiIpICsKICAgICAgICAgICAgICAgICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhwYWlyZWQ9VCwgbGFiZWw9InAuZm9ybWF0IiwgbGFiZWwueSA9IDEuNCkKaXNvdHlwZV9ib3hwbG90X3BvcF9tCmBgYAoKYGBge3IsIGVjaG89Rn0KZ2dzYXZlKHBsb3QgPSBpc290eXBlX2JveHBsb3RfcG9wX20sIGZpbGVuYW1lID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV91c2FnZV9ib3hwbG90X01fcG9wdWxhdGlvbi5wbmciKSwgZGV2aWNlPSJwbmciLAogICAgICAgIHdpZHRoID0gMTUsIGhlaWdodCA9IDYsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90ID0gaXNvdHlwZV9ib3hwbG90X3BvcF9tLCBmaWxlbmFtZSA9IHBhc3RlMChpc290eXBlX2RpciwiL0lzb3R5cGVfdXNhZ2VfYm94cGxvdF9NX3BvcHVsYXRpb24ucGRmIiksIGRldmljZT0icGRmIiwKICAgICAgICB3aWR0aCA9IDE1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQpgYGAKCgoKCiMgQ2l0YXRpb25zCgpJZiB5b3UgdXNlIG5mLWNvcmUvYmNlbGxtYWdpYyBmb3IgeW91ciBhbmFseXNpcywgcGxlYXNlIGNpdGUgaXQgdXNpbmcgdGhlIGZvbGxvd2luZyBET0k6IFsxMC41MjgxL3plbm9kby4zNjA3NDA4XShodHRwczovL2RvaS5vcmcvMTAuNTI4MS96ZW5vZG8uMzYwNzQwOCkKClBsZWFzZSBhbHNvIGNpdGUgdGhlIGBuZi1jb3JlYCBwdWJsaWNhdGlvbiBbQGV3ZWxzMjAyMF0uCgpJbiBhZGRpdGlvbiwgY2l0YXRpb25zIGZvciB0aGUgdG9vbHMgYW5kIGRhdGEgdXNlZCBpbiB0aGlzIHBpcGVsaW5lIGFyZSBhcyBmb2xsb3dzOgoKKiAqKnBSRVNUTyoqIFtAVmFuZGVySGVpZGVuMjAxNF0KKiAqKlNIYXphTSwgQ2hhbmdlLU8qKiBbQEd1cHRhMjAxNV0KKiAqKkFsYWthemFtKiogW0BTdGVybjIwMTRdCiogKipUSWdHRVIqKiBbQEdhZGFsYS1NYXJpYTIwMTVdCiogKipGYXN0UUMqKiBbQGFuZHJld3MyMDEwXQoqICoqTXVsdGlRQyoqIFtAZXdlbHMyMDE2XQo=